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 Javaclass 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 Javaclass Main{    public static void main(String[] args)    {        // Anonymous class        Person person = new Person() {{                // Initializer block                setName("John");                setAge(22);            }};         System.out.println(person);    }}
   复制代码
 
构造函数与方法的区别
评论