首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

Java 建構器初始化順序詳解:靜態欄位、實例欄位與建構器執行流程

     編輯:關於C

核心結論:初始化順序鐵律

  1. 父類靜態欄位/靜態區塊(按聲明順序)
  2. 子類靜態欄位/靜態區塊(按聲明順序)
  3. 父類實例欄位/實例初始化區塊(按聲明順序)
  4. 父類建構器
  5. 子類實例欄位/實例初始化區塊(按聲明順序)
  6. 子類建構器

驗證範例與輸出分析

public class Window {
    Window(int marker) { System.out.println("Window(" + marker + ")"); }
}

public class House {
    Window w1 = new Window(1);  // 實例欄位初始化
    House() {
        System.out.println("House()");
        w3 = new Window(33);    // 建構器內賦值
    }
    Window w2 = new Window(2);
    Window w3 = new Window(3);
}

public class OrderOfInitialization {
    public static void main(String[] args) {
        House h = new House();
        h.f();
    }
}

/* 輸出:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*/

關鍵觀察

  • 無論欄位聲明在建構器前後,實例欄位初始化總在建構器體之前完成
  • 將 w1 移至建構器後,輸出順序不變,證明聲明位置不影響初始化時機
  • 新增 Door 類欄位,其初始化同樣插在建構器體之前

最佳實踐建議

  1. 避免在建構器中調用可被覆寫的方法(子類欄位尚未初始化)
  2. 將複雜初始化邏輯集中在建構器,欄位聲明保持簡單
  3. 靜態初始化異常會導致 ExceptionInInitializerError,需謹慎處理
  4. 使用 final 欄位強制在宣告或建構器末尾完成初始化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved