2013-06-05 65 views
0

以下代碼在編譯並運行時會將輸出顯示爲「alpha subsub」。 SubSubAlpha();構造函數應該將「subsub」添加到變量s並且應該是輸出。使用構造函數創建新對象

輸出是「alpha subsub」怎麼樣?

class Alpha { 
    static String s = " "; 

    protected Alpha() { 
     s += "alpha "; 
    } 
} 

public class SubSubAlpha extends Alpha { 
    private SubSubAlpha() { 
     s += "subsub "; 
    } 

    public static void main(String[] args) { 
     new SubSubAlpha(); 
     System.out.println(s); 
     // This prints as " alpha subsub". 
     //Shouldn't this one be printed as " subsub" 
     //Who made the call to Alpha(); ? 
    } 
} 
+2

您擴展阿爾法類,因此這種構造類首先被調用。 –

回答

1

當存在類的層次結構時,子類的構造函數(本例中爲SubSubAlpha)總是調用(第一個)超類的構造函數,在此例中爲Alpha

所以會發生什麼居然是:

private SubSubAlpha() { 
    super(); 
    s += "subsub "; 
} 

因此,這使得:

​​

使字符串 「阿爾法subsub」

1

這是因爲當你創建對象的時候,父對象的構造函數被調用,並且它繼續到Object類。你的Alpha內部擴展了Object類。因此,首先SubSubAlpha構造函數被調用它調用阿爾法構造函數,後者又調用對象的構造函數,並執行通過Alpha和最終SubSubAlpha

從Object流有關信息
構造函數調用層次父的該構造函數被調用然後調用子進程的構造函數。但是如果你調用一個方法,它會在子類中搜索。如果未在子類中找到,則在父類中搜索該方法。

參考
Order of Constructor Call

1

當調用子類的構造器的第一個指令是給超類構造器的調用。當你創建一個SubSubAlpha對象

因此,Alpha構造增加了阿爾法s屬性,然後SubSubAlpha constructro增加了subsub

1

讓我在生成的字節碼沒有變化只是稍微重寫你的構造器,

private SubSubAlpha() { super(); s += "subsub "; } 

現在應該馬上清楚執行什麼和按什麼順序。

相關問題