Java中的构造方法(非常详细)
Java 中,构造方法的声明和普通方法的声明类似,需要注意的是,构造方法的名称与类名相同,并且没有返回值类型。
例如,为 Employee 类添加一个构造方法:
如果你意外给构造方法指定了一个返回类型,例如:
当使用 new 运算符时,构造方法将会执行。例如以下表达式将会分配一个 Employee 类的对象,并调用构造方法:
new 运算符返回一个对构造对象的引用。通常,你需要将该引用保存在变量中:
例如,如果想简化对无名“工蜂”的建模,那么可以提供第二个构造方法,它只接受薪水作为参数:
注意,如果有多个同名的方法,但是它们的参数不同,则称这些方法是重载的。例如,常用的 println() 方法有参数为 int、double、String 等的重载版本。由于无法选择构造方法的名字,因此需要使用重载来声明多个构造方法。
出人意料的是,在调用中并不能使用构造方法的名称,而是要使用关键字 this:
例如:
例如,这里是一个没有参数的 Employee 类构造方法:
因此,每个类都至少有一个构造方法。如果一个类已经有一个构造方法了,那么它将不会自动获得另一个没有参数的构造方法。如果你提供了一个构造方法,并且还需要一个无参数构造方法,那么必须自己编写。
例如,为 Employee 类添加一个构造方法:
public class Employee { private String name = ""; private double salary; //构造方法 public Employee(String name, double salary) { this.name = name; this.salary = salary; }通常情况下,构造方法是公有的,但有时声明私有构造方法也很有用。例如,LocalDate 类就没有公有构造方法。类用户将会从“工厂方法”(如 now() 方法和 of() 方法)中获取对象,这些方法能够调用一个私有构造方法。
如果你意外给构造方法指定了一个返回类型,例如:
public void Employee(String name, double salary)那么这表示你声明了一个名为 Employee 的方法,而不是一个构造方法。
当使用 new 运算符时,构造方法将会执行。例如以下表达式将会分配一个 Employee 类的对象,并调用构造方法:
new Employee("James Bond", 500000)构造方法体内将实例变量设置为构造方法中提供的参数。
new 运算符返回一个对构造对象的引用。通常,你需要将该引用保存在变量中:
var james = new Employee("James Bond", 500000);或将其传递给其他方法:
var staff = new ArrayList<Employee>(); staff.add(new Employee("James Bond", 500000));
Java构造方法重载
Java 允许一个类中提供多个版本的构造方法。例如,如果想简化对无名“工蜂”的建模,那么可以提供第二个构造方法,它只接受薪水作为参数:
public Employee(double salary) { // name already set to "" this.salary = salary; }现在,Employee 类就有了两个构造方法,具体会调用哪个构造方法取决于参数的设置。
var james = new Employee("James Bond", 500000); // calls Employee(String, double) constructor var anonymous = new Employee(40000); // calls Employee(double) constructor在这种情况下,我们说构造方法是一种重载(overloaded)。
注意,如果有多个同名的方法,但是它们的参数不同,则称这些方法是重载的。例如,常用的 println() 方法有参数为 int、double、String 等的重载版本。由于无法选择构造方法的名字,因此需要使用重载来声明多个构造方法。
Java构造方法间的调用
当有多个构造方法时,它们通常会有一些共同的工作,最好不要重复编写这些代码。通常可以将这些共同的初始化工作放入一个构造方法中。然后,可以从一个构造方法调用另一个构造方法,但这时的调用语句只能作为构造方法体的第一条语句。出人意料的是,在调用中并不能使用构造方法的名称,而是要使用关键字 this:
public Employee(double salary) { this("", salary); // Calls Employee(String, double) // Other statements can follow }注意,这里的 this 不是正在被构造的对象的引用。相反,它是一种特殊语法,仅用于调用同一类的另一个构造方法。
Java构造方法的默认初始化
如果你没有在构造方法中显式地设置实例变量,那么它将被自动设置为默认值:- 数值的默认值为 0;
- boolean 值的默认值为 false;
- 对象引用的默认值为 null。
例如:
public Employee(String name) { // salary automatically set to zero this.name = name; }构造方法中仅为 name 设置了初值,此时 salary 的值会被自动设置为 0。
Java无参数构造方法
许多类都包含一个无参数的构造方法,该构造方法创建的对象的状态会被设置为适当的默认值。例如,这里是一个没有参数的 Employee 类构造方法:
public Employee() { name = ""; salary = 0; }就像给穷困潦倒的被告提供公设辩护人一样,一个没有构造方法的类会自动被赋予一个没有任何参数的构造方法。除非已经被显式初始化,否则所有实例变量都保持默认值(0、false或null)。
因此,每个类都至少有一个构造方法。如果一个类已经有一个构造方法了,那么它将不会自动获得另一个没有参数的构造方法。如果你提供了一个构造方法,并且还需要一个无参数构造方法,那么必须自己编写。