2012-03-20 70 views
3

在下面的代码中,输出是:S1S2。为什么我们得到那个结果?为什么我们有这种情况下的输出: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"); 
    } 
} 
+1

查找[构造函数链接](http://www.leepoint.net/notes-java/oop/constructors/constructor.html)。 – 2012-03-20 00:32:32

+0

对于[SSCCE](http://sscce.org/)的好问题+1。 – 2012-03-20 00:34:38

回答

3

由于S2扩展了S1,所以它相当于以最高级别的顺序调用所有构造函数。

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

+1

它会先从'S1'调用'Object's'构造函数。 – twain249 2012-03-20 00:34:34

2

如果一个派生类的构造函数不显式调用基类的构造函数(通过super(...))再有就是在每个派生类的构造函数隐式调用

super(); 

基类的默认构造函数。

2

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

下面是从规格报价:

如果构造体不明确的构造 调用和正在申报的构造开始不是 原始类对象的一部分,然后在构造函数体隐含地, 由编译器假定以超类构造函数 调用“super();”为参数,该函数调用其不带参数的直接 超类的构造函数。

相关问题