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

Java 類初始化順序深度解析:靜態/實例塊、建構子、繼承鏈

     編輯:Java 相關知識

類初始化順序是面試高頻考點,也是理解物件生命週期的關鍵。本文通過可執行代碼與執行結果,徹底釐清「誰先誰後」的鐵律。

測試代碼

public class InitOrderTest {
    public static String staticField = "靜態變量";
    public String field = "變量";

    // 靜態初始化塊
    static {
        System.out.println(staticField);
        System.out.println("靜態初始化塊");
    }

    // 實例初始化塊
    {
        System.out.println(field);
        System.out.println("初始化塊");
    }

    // 建構子
    public InitOrderTest() {
        System.out.println("建構方法");
    }

    public static void main(String[] args) {
        new InitOrderTest();
    }
}

執行輸出

靜態變量
靜態初始化塊
變量
初始化塊
建構方法

鐵律總結(單類)

  1. 靜態變量賦值 → 靜態初始化塊(按代碼順序,類載入時僅執行一次)
  2. 實例變量賦值 → 實例初始化塊(按代碼順序,每 new 一次執行一次)
  3. 建構方法 執行

繼承鏈初始化順序(父 → 子)

父類靜態變量/塊 → 子類靜態變量/塊 → 父類實例變量/塊 → 父類建構子 → 子類實例變量/塊 → 子類建構子

核心原則:父類初始化完全結束後,子類才開始;靜態只在類首次載入時跑一次,實例每次實例化都跑。

常見陷阱

  • 靜態塊中引用實例變量 → 編譯錯誤。
  • 建構子中呼叫被覆寫的方法 → 子類實例變量尚未初始化,易導致空指針或邏輯錯誤。
  • final 修飾的實例變量必須在宣告時、實例塊或建構子中賦值,且僅能賦值一次。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved