我對實例初始化塊何時運行感到困惑。 據凱西塞拉利昂的書:實例初始化塊和子類
實例初始化塊運行每次創建一個類的實例
因此,考慮有兩班時間:家長和孩子,根據this question和Java的文檔:
實例化子類對象只創建子類 類型的1個對象,但調用其所有超類的構造函數。
根據以上: 爲什麼位於超類的實例初始化塊被調用每個子類的對象實例的時間?它不像超類的新對象被實例化。
我對實例初始化塊何時運行感到困惑。 據凱西塞拉利昂的書:實例初始化塊和子類
實例初始化塊運行每次創建一個類的實例
因此,考慮有兩班時間:家長和孩子,根據this question和Java的文檔:
實例化子類對象只創建子類 類型的1個對象,但調用其所有超類的構造函數。
根據以上: 爲什麼位於超類的實例初始化塊被調用每個子類的對象實例的時間?它不像超類的新對象被實例化。
編譯實例初始化塊成爲構造函數的一部分。 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;
}
}
因此初始塊構造運行時運行。
它不像是超類的新對象被實例化。
實際上,就是這樣。
子類的每個實例都隱式包含其超類的一個實例。
超類的構造函數總是調用在任何構造的第一步(而這又運行了超任何實例初始化塊)
我知道,所有的超類的構造函數會被調用,但我的理解是,無論調用這些構造函數:只有一個對象正在實例化/創建那裏,這是子類。 – 2013-04-21 04:55:51
你可以這樣看待它。但是你也可以說同一個對象也是超類的一個實例。可以肯定的是,實例除了包含它自己之外,還包含超類定義的所有字段。 – Thilo 2013-04-21 05:43:31
因爲總有一個隱含的super()
通話(如果沒有明確完成)以父級的構造函數在孩子的構造函數中。
雖然這是一箇舊的文章我碰到這個概念就認爲值得分享它
因爲我們在這裏討論的實例塊是如何實例代碼流程執行父子關係類 //兒童伸出父 如果我們創建一個對象兒童
1)的類的實例成員的鑑定從父到子
2)僅在父類的實例變量賦值和實例塊的執行
3)父類的構造執行
4)實例變量賦值和實例塊只在兒童類執行
5)子構造的執行
實際上,還有一點,在任何現有的超級構造函數調用之後,實例初始化塊將被添加到構造函數中。請參閱http://java-blog.kbsbng.com/2016/01/instance-initializer-blocks-in-java.html以供參考 – kbsbng 2016-01-10 09:28:40