Java简述super()与this()的区别?
参考答案:
在Java中,super()
和this()
都是特殊类型的构造函数调用,它们被用于在构造函数中初始化父类和当前类的状态。但是,它们之间存在一些关键的区别:
-
调用对象:
super()
:用于调用父类(或超类)的构造函数。this()
:用于调用当前类的另一个构造函数(也称为重载构造函数)。
-
使用时机:
super()
:在子类的构造函数中,第一行必须是super()
调用(如果父类没有无参构造函数,则必须明确指定参数),以初始化从父类继承的字段。this()
:可以在任何构造函数中调用,以初始化当前类的字段。通常,它用于共享一些初始化代码,以避免重复。
-
调用次数:
super()
:在一个子类的构造函数中只能调用一次。this()
:可以在一个构造函数中多次调用,用于调用当前类的其他构造函数。但是,必须确保this()
调用是构造函数中的第一条语句。
-
默认行为:
- 如果子类构造函数没有显式调用
super()
,则Java编译器会隐式地插入一个super()
调用作为第一行。这确保了父类被正确初始化。 this()
调用不是隐式的。如果需要使用其他构造函数初始化当前对象,必须显式调用this()
。
- 如果子类构造函数没有显式调用
示例:
class Parent {
Parent() {
System.out.println("Parent Constructor");
}
Parent(String message) {
System.out.println("Parent Constructor with message: " + message);
}
}
class Child extends Parent {
Child() {
super(); // 显式调用父类的无参构造函数
System.out.println("Child Constructor");
}
Child(String message) {
super(message); // 显式调用父类的带参数构造函数
System.out.println("Child Constructor with message: " + message);
}
Child(String message, int number) {
this(message); // 调用当前类的另一个构造函数
System.out.println("Child Constructor with message and number: " + number);
}
}
public class Test {
public static void main(String[] args) {
new Child(); // 输出:Parent Constructor, Child Constructor
new Child("Hello"); // 输出:Parent Constructor with message: Hello, Child Constructor with message: Hello
new Child("Hello", 42); // 输出:Parent Constructor with message: Hello, Child Constructor with message: Hello, Child Constructor with message and number: 42
}
}
这个示例展示了如何在子类的构造函数中使用super()
和this()
,以及它们如何影响构造函数的行为。