首页 > 编程笔记 > Java笔记 阅读:4

Java中的构造方法(非常详细)

Java 中,构造方法的声明和普通方法的声明类似,需要注意的是,构造方法的名称与类名相同,并且没有返回值类型。

例如,为 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构造方法的默认初始化

如果你没有在构造方法中显式地设置实例变量,那么它将被自动设置为默认值:
例如:
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)。

因此,每个类都至少有一个构造方法。如果一个类已经有一个构造方法了,那么它将不会自动获得另一个没有参数的构造方法。如果你提供了一个构造方法,并且还需要一个无参数构造方法,那么必须自己编写。

相关文章