C ++ 引入了构造器(constructor)的概念,它是在创建对象时被自动调用的特殊方法。
Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源的时候,垃圾收集器会自动将其释放。
原生方法
想法是使用 new 运算符获取类的实例并使用类设置器设置值
import java.util.Arrays;
class Person
{
private String name;
private int age;
@Override
public String toString() {
return Arrays.asList(name, String.valueOf(age)).toString();
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// getters
}
// Initialize an object in Java
class Main
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("John");
person.setAge(22);
System.out.println(person);
}
}
复制代码
构造器保证初始化
在 Java 中,可以通过编写构造器来确保每个对象的初始化。但是这里有两个问题:
这个构造器使用的任何名字都有可能与类里某个成员相冲突;
编译器负责调用构造器,所以它必须始终知道应该调用哪个方法。
C++ 语言采用的方案就是将构造器和类的名字定义相同,Java 也采用了这个方案。
如下的例子:
import java.util.Arrays;
class Person {
private String name;
private int age;
// 构造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return Arrays.asList(name, String.valueOf(age)).toString();
}
}
class SimpleConstructor {
public static void main(String[] args) {
Person person = new Person("Yuzhou1su", 22);
System.out.println(person);
}
}
复制代码
运行结果:
无参构造器
没有参数的构造函数称为默认构造函数。默认构造函数的语法如下:
有参构造器
具有参数的构造函数称为参数化构造函数。问题: 为什么使用参数化构造函数?回答: 参数化构造函数用于为不同对象提供不同初始化的值。参数化构造函数的示例在这个例子中,我们创建了具有两个参数的 Student 类的构造函数。构造函数中柯有任意数量的参数。class Student4 {int id;String name;
Student4(int i, String n) {
id = i;
name = n;
}
void display() {
System.out.println(id + " " + name);
}
public static void main(String args[]) {
Student4 s1 = new Student4(111, "Karan");
Student4 s2 = new Student4(222, "Aryan");
s1.display();
s2.display();
}
复制代码
构造器重载
复制构造器
复制构造函数是一种特殊构造函数,用于将新对象创建为现有对象的副本。它只需要一个参数,它将是同一类的另一个实例。我们可以使用 this()
语句从复制构造函数中显式调用另一个构造函数:
class Person
{
private String name;
private int age;
// 构造器
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
// 复制构造器
public Person(Person person) {
this(person.name, person.age);
}
public String toString() {
return Arrays.asList(name, String.valueOf(age)).toString();
}
// setters and getters 方法
}
复制代码
匿名内部类
另一种初始化对象的方法是使用“双大括号初始化”。这将创建一个匿名内部类,其中只有一个实例初始化程序。强烈建议不要使用这种方法。
import java.util.Arrays;
class Person
{
private String name;
private int age;
@Override
public String toString() {
return Arrays.asList(name, String.valueOf(age)).toString();
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// getters
}
// Initialize an object in Java
class Main
{
public static void main(String[] args)
{
// Anonymous class
Person person = new Person() {{
// Initializer block
setName("John");
setAge(22);
}};
System.out.println(person);
}
}
复制代码
构造函数与方法的区别
评论