建立 House 物件時,發現 Window 成員的建構子先於 House 自身的建構子執行,這是 Java 物件初始化的標準流程。
class Window {
Window(int id) { System.out.println("Window(" + id + ")"); }
}
class House {
Window w1 = new Window(1); // 成員變數初始化
Window w2 = new Window(2);
Window w3 = new Window(3);
House() { System.out.println("House()"); } // 建構子本體
}
public class Test {
public static void main(String[] args) {
new House();
}
}
// 輸出:
// Window(1)
// Window(2)
// Window(3)
// House()
物件被視為「完整」的前提是所有成員都已就緒。若建構子本體先執行,成員可能尚未初始化,導致在建構子中存取成員時發生 NullPointerException 或狀態不一致。Java 強制「成員先備妥,建構子再邏輯」保證物件一致性。
new 會在每次建立實例時執行,若成員較重或需參數,建議改在建構子中初始化 (依賴注入)。StackOverflowError (循環初始化) 與分析效能熱點。掌握初始化順序,是寫出健壯 Java 類別的關鍵基石。