什么是构造函数链?
Java中的构造函数是在类的对象创建中使用的特定方法。每次创建类的对象时都会调用构造函数。它可用于在创建时为对象的属性赋值。一个 Java 类中可以有多个具有不同参数列表的构造函数。构造函数链接用于在对象创建时调用同一类/父类的构造函数的不同实现。
构造函数链是如何在 Java 中实现的?
根据如何调用构造函数,有两种链接构造函数的方法。它们如下。
- 使用this()关键字——调用同一类的构造函数
- 使用super()关键字——调用父类的构造函数
这在以下示例中进行了解释。
构造函数链接示例 #1 – 构造函数使用 this() 关键字链接
我们为 DerivedClass 声明了四个构造函数。一个没有参数,另外三个有不同的参数。在每个构造函数中,
this()关键字用于调用同一类的下一个构造函数。
package com.tutorialwriting.constchaining;
public class DerivedClass{
String firstName;
String country;
int age;
public DerivedClass() {
// calling one argument constructor
this("Maggie");
}
public DerivedClass(String firstName) {
// calling two argument constructor
this(firstName, 15);
}
public DerivedClass(String firstName, int age) {
// calling three argument constructor
this(firstName, age, "Australia");
}
public DerivedClass(String firstName, int age, String country) {
this.firstName = firstName;
this.age = age;
this.country = country;
}
void displayValues() {
System.out.println("First Name : " + firstName);
System.out.println("Country : " + country);
System.out.println("Age : " + age);
}
public static void main(String args[]) {
DerivedClass object = new DerivedClass();
object.displayValues();
}
}
执行的输出
构造函数链接示例 #2 – 构造函数使用 super() 关键字链接
在这里,子类使用super()关键字调用父类的构造函数。BaseClass 具有三个构造函数。
没有参数的构造函数使用this()调用 BaseClass 的三参数构造函数之一。
package com.tutorialwriting.constchaining;
public class BaseClass {
public BaseClass() {
//calling a three argument constructor of the same class
this("Male", "English", "1989/11/10");
System.out.println("I'm executed third!!!");
}
public BaseClass(String firstName, String surname, int idNo) {
System.out.println("I'm executed first!");
System.out.println("First name : " + firstName);
System.out.println("Surname : " + surname);
System.out.println("ID Number : " + idNo);
}
public BaseClass(String gender, String nationality, String birthDate) {
System.out.println("I'm executed second!!");
System.out.println("Gender : " + gender);
System.out.println("Nationality : " + nationality);
System.out.println("Birth Date : " + birthDate);
}
}
DerivedClass 有两个构造函数,每个构造函数都使用
super()调用超类的不同构造函数。
package com.tutorialwriting.constchaining;
public class DerivedClass extends BaseClass {
public DerivedClass() {
//calling no argument constructor of the super class
super();
}
public DerivedClass(String firstName, String surname, int idNo) {
//calling three argument constructor of the super class
super(firstName, surname, idNo);
}
public static void main(String args[]) {
DerivedClass object2 = new DerivedClass("Paul", "Wilson", 123456);
DerivedClass object1 = new DerivedClass();
}
}
执行的输出
隐式与显式构造函数调用
Java 有两种不同的调用构造函数的方式:隐式调用和显式调用。
- 显式调用是指在代码中使用this()或super()显式调用构造函数。
- 隐式调用是指在子类构造函数没有显式调用的情况下隐式调用超类的无参数构造函数。换句话说,如果程序员明确不在代码中调用super() ,编译器会将super()调用添加为子类的任何构造函数的第一行。
为什么我们需要构造函数链接?
在 Java 中使用构造函数链有几个不同的目的,如下所列。
- 它是一种访问其他构造函数的属性或父类的属性的方法。
- 在调用其他构造函数时,只使用了一个对象,即该类的当前实例。初始化发生在一个地方,但我们有特权通过链调用不同的构造函数实现。这对内存管理和代码维护有很大帮助。
结论
在本教程中,我们讨论了 Java 中的构造函数链。构造函数是在创建对象时调用的类方法代码段。一个 Java 类可以有任意数量的具有不同参数列表的构造函数。构造函数链接是一种使用类的一个实例处理不同初始化的简便方法。下面列出了本教程中需要注意的一些要点。
- 如果程序员没有明确地将其添加到代码中,编译器将向 Java 类添加一个公共的无参数构造函数。这称为默认构造函数。
- this()和super()应该写在构造函数的第一行。
- this()用于调用同一类的构造函数,而super()用于调用直接超类的构造函数。
- 类中至少应该有一个不包含this()关键字的构造函数。
- 如果未明确添加,编译器会向每个子类构造函数添加一个无参数super()调用。这将有助于正确实例化类。
GO TO FULL VERSION