在下面的代码中,输出为:S1S2。为什么我们得到那个结果?
public class S1 {
public static void main(String[] args) {
new S2();
}
S1(){
System.out.print("S1");
}
}
class S2 extends S1{
S2(){
System.out.print("S2");
}
}
答案 0 :(得分:3)
由于S2扩展了S1,它相当于以顶级向下顺序调用所有构造函数。
Java将首先创建父对象S1并调用它的构造函数。然后向下移动到下一个对象,S2用它的构造函数。
答案 1 :(得分:2)
如果派生类的构造函数没有显式调用其基类的构造函数(通过super(...)
),则存在隐式调用
super();
到每个派生类的构造函数中的基类的默认构造函数。
答案 2 :(得分:2)
在子类的构造函数中,有一个对超类的默认构造函数的隐式调用。
以下是Spec:
的引用如果构造函数体不以显式构造函数开头 调用和声明的构造函数不是 原始类Object,然后构造函数体是隐式的 编译器假定以超类构造函数开头 调用“super();”,调用其直接的构造函数 不带参数的超类。