为什么我们有输出:在这种情况下是S1S2?

时间:2012-03-20 00:30:48

标签: java

在下面的代码中,输出为: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");
     }
 }

3 个答案:

答案 0 :(得分:3)

由于S2扩展了S1,它相当于以顶级向下顺序调用所有构造函数。

Java将首先创建父对象S1并调用它的构造函数。然后向下移动到下一个对象,S2用它的构造函数。

答案 1 :(得分:2)

如果派生类的构造函数没有显式调用其基类的构造函数(通过super(...)),则存在隐式调用

super();

到每个派生类的构造函数中的基类的默认构造函数。

答案 2 :(得分:2)

在子类的构造函数中,有一个对超类的默认构造函数的隐式调用。

以下是Spec:

的引用
  

如果构造函数体不以显式构造函数开头   调用和声明的构造函数不是   原始类Object,然后构造函数体是隐式的   编译器假定以超类构造函数开头   调用“super();”,调用其直接的构造函数   不带参数的超类。