2012-03-20 123 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();」爲參數,該函數調用其不帶參數的直接 超類的構造函數。

相關問題