什么是构造器

构造器通常也叫构造方法、构造函数,在项目中几乎无处不在。当给类创建一个对象时,new 关键字实际上是在调用构造器。在调用构造器的时候,如果类中没有写构造器,那么系统会默认分配一个空构造器,也可以自己显式地将构造器编写出来,其格式为:

[修饰符] 类名(){} // []中的修饰符是可选项

创建对象的过程

第一次执行到某个类创建对象的代码的时候,会进行类的加载,此时类的字节码信息会被加载到方法区。与此同时,系统会为这个对象在堆中开辟空间,然后为对象进行属性的初始化。需要注意的是,类的字节码信息只会在第一次创建对象的时候被加载一次。

构造器的作用

构造器的作用不是为了创建对象,因为在调用构造器之前,这个对象就已经创建好了,并且属性有默认的初始化的值。调用构造器是给属性进行赋值操作的。需要注意的是,我们一般不会在空构造器中进行初始化操作,因为那样的话每个对象的属性就都一样了,我们只需要保证空构造器的存在即可。

构造器和普通方法的区别

  • 构造器没有方法的返回值类型
  • 构造器没有 return 语句
  • 构造器的名字要跟类名保持一致

构造器的重载

因为我们一般不会在空构造器中进行初始化操作,所以一般要重载构造器,在重载的构造器中对属性进行赋值操作。需要注意的是,在重载构造器以后,如果空构造器忘写了,系统也不会给你分配默认的空构造器了,那么你要调用的话就会出错。

下面是一个构造器重载的例子:

public class Person {
    String name;
    int age;
    double height;

    public Person(){}
    public Person(String name,int age,double height){
        this.name = name;
        this.age = age;
        this.height = height;
    }
    public Person(String a,int b){
        name = a;
        age = b;
    }
    public void eat(){
        System.out.println("我喜欢吃饭");
    }

    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person("lili",19,180.4);
        System.out.println(p2.age);
        System.out.println(p2.height);
        System.out.println(p2.name);
    }
}

这里有一点要注意,当形参名和属性名相同的时候,会出现就近原则,例如上面代码中的一个构造器写成下面这样:

public Person(String name,int age,double height){
    name = name;
    age = age;
    height = height;
}

此时等号左侧的变量都会以为自己表示的是形参,而不是类的属性。所以我们需要在要表示对象的属性前加上 this. 来修饰 ,因为 this 代表的就是你创建的那个对象。