2013-04-21 139 views
2

我對實例初始化塊何時運行感到困惑。 據凱西塞拉利昂的書:實例初始化塊和子類

實例初始化塊運行每次創建一個類的實例

因此,考慮有兩班時間:家長和孩子,根據this question和Java的文檔:

實例化子類對象只創建子類 類型的1個對象,但調用其所有超類的構造函數。

根據以上: 爲什麼位於超類的實例初始化塊被調用每個子類的對象實例的時間?它不像超類的新對象被實例化。

回答

5

編譯實例初始化塊成爲構造函數的一部分。 javac只是增加了初始塊到每個構造函數,那就是:

public class Test1 { 
    int x; 
    int y; 

    { 
     x = 1; 
    } 

    Test1() { 
     y = 1; 
    } 
} 

等效於此:

public class Test1 { 
    int x; 
    int y; 

    Test1() { 
     x = 1; 
     y = 1; 
    } 
} 

因此初始塊構造運行時運行。

+0

實際上,還有一點,在任何現有的超級構造函數調用之後,實例初始化塊將被添加到構造函數中。請參閱http://java-blog.kbsbng.com/2016/01/instance-initializer-blocks-in-java.html以供參考 – kbsbng 2016-01-10 09:28:40

1

它不像是超類的新對象被實例化。

實際上,就是這樣。

子類的每個實例都隱式包含其超類的一個實例。

超類的構造函數總是調用在任何構造的第一步(而這又運行了超任何實例初始化塊)

+0

我知道,所有的超類的構造函數會被調用,但我的理解是,無論調用這些構造函數:只有一個對象正在實例化/創建那裏,這是子類。 – 2013-04-21 04:55:51

+1

你可以這樣看待它。但是你也可以說同一個對象也是超類的一個實例。可以肯定的是,實例除了包含它自己之外,還包含超類定義的所有字段。 – Thilo 2013-04-21 05:43:31

-1

因爲總有一個隱含的super()通話(如果沒有明確完成)以父級的構造函數在孩子的構造函數中。

0

雖然這是一箇舊的文章我碰到這個概念就認爲值得分享它

因爲我們在這裏討論的實例塊是如何實例代碼流程執行父子關係類 //兒童伸出父 如果我們創建一個對象兒童

1)的類的實例成員的鑑定從父到子

2)僅在父類的實例變量賦值和實例塊的執行

3)父類的構造執行

4)實例變量賦值和實例塊只在兒童類執行

5)子構造的執行