构造器

在下面代码栗子中,当new出一个Student对象的时,必须给新生成的学生起名字(毕竟不存在一个没有名字的人),但是当新建的对象数量过多的时候就有可能会忘记分配名字。

public class Student {
String name;

public void words() {
System.out.println(name + " is a student.");
}

public static void main(String[] args) {
Student t = new Student();
t.name = "Tom";
t.words();
}
}

这个时候,如果你new出一个新的对象,你想但是又不想它的初始状态为空值,这时就可以用构造器来大显身手了。所以我们不妨在new出该对象的同时,赋给其某些变量的初始值(这里是学生姓名)。

public class Student {
String name;

//这就是构造器,在对象生成的时候需要调用的方法(没有类型,没有返回值,方法名必须和类名一致)
public Student(String name) {
this.name = name;
}

public void words() {
System.out.println(name + " is a student.");
}

public static void main(String[] args) {
Student t = new Student("Jerry");
t.words();
}
}

默认构造器

但是在有的时候我们编写类的时候,并不会编写类的构造函数,这时,编译器会默认给我们添加上一个没有参数的构造函数(依然采用上述的Student类)。

//默认的构造函数,没有返回值
public Student(){

}

编译器会添加上述的构造函数到类中。但是如果开发者在开发过程中,自己编写了新的构造函数,那么编译器便不会添加默认的构造函数。


构造器的重载

如果类在创建的时候,存在多个参数,或者是否给实例变量赋于初值无关紧要的话。这时候如果编写了一个构造函数的话,那么默认的构造函数便不会再添加其中,但又想要添加默认的构造函数。这时,我们直接对构造函数进行重载来实现我们需要的功能。

public class Student {

String name;
int age;

public Student() {
//什么也不做,默认的构造函数
}

public Student(String name) {
//new Student类的时候,只赋name的参数
this.name = name;
}

public Student(int age) {
// new Student类的时候,只赋age的参数
this.age = age;
}

public Student(String name, int age) {
// new Student类的时候,赋name,age的参数
this.name = name;
this.age = age;
}

public Student(int age, String name) {
// 和上一个构造函数一样功能,但是参数加入未知不同
this.name = name;
this.age = age;
}

public void words() {
System.out.println(name + " is a student, age is " + age);
}

public static void main(String[] args) {
Student t0 = new Student();
Student t1 = new Student("Jerry");
Student t2 = new Student(10);
Student t3 = new Student("Tom",12);
Student t4 = new Student(15,"Peter");
//t0,t1,t2 有没赋于初值的变量,调用words的方法,显示的信息不会完整
//这也就是最初引入构造器的原因
t3.words();
t4.words();
}
}

Tips

  1. 构造器没有类型,没有返回值。
  2. 构造函数的方法名必须和所在类的名称必须一致。
  3. 如果不编写构造器,编译器会自动添加一个没有参数,不执行任何操作的构造函数。
  4. 如果用户编写了单一构造函数,那么系统便不会再添加默认构造函数。
  5. 如果要添加多个构造函数,需要用到重载。