首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 物件初始化順序:為何建構子執行前成員已先被初始化?

     編輯:程式設計疑難解答

建立 House 物件時,發現 Window 成員的建構子先於 House 自身的建構子執行,這是 Java 物件初始化的標準流程。

初始化順序鐵律

  1. 靜態成員/靜態區塊: 類別載入時,依宣告順序執行 (父類別優先)。
  2. 非靜態成員/初始化區塊: 建立實例時,依宣告順序執行 (父類別優先)。
  3. 建構子本體: 最後執行當前類別的建構子程式碼。

範例解析

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 會在每次建立實例時執行,若成員較重或需參數,建議改在建構子中初始化 (依賴注入)。
  • 避免在成員初始化或建構子中呼叫可被覆寫的方法,否則子類別成員尚未初始化時父類建構子已呼叫該方法,易發生 Bug。
  • 理解順序有助於除錯 StackOverflowError (循環初始化) 與分析效能熱點。

掌握初始化順序,是寫出健壯 Java 類別的關鍵基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved