Java 類初始化過程涉及三類關鍵構建塊:靜態代碼塊、實例代碼塊(構造代碼塊)、構造方法。它們的執行順序遵循 JVM 類加載與對象實例化的嚴格規範,理解這一機制對於掌握繼承體系初始化、單例模式實現、依賴注入順序等核心場景至關重要。
package com.test;
public class HelloB extends HelloA {
public HelloB() { }
{
System.out.println("I'm B class");
}
static {
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
}
}
class HelloA {
public HelloA() { }
{
System.out.println("I'm A class");
}
static {
System.out.println("static A");
}
}
static A static B I'm A class I'm B class
Class 對象static A → static B)super() 調用之後、構造方法體之前super(),確保父類優先構建完成| 陷阱代碼 | 錯誤預期 | 正確結果 | 原因 |
|---|---|---|---|
子類構造方法首行調用 this() | 父類構造執行兩次 | 父類僅執行一次 | this() 調用本類其他構造,最終仍走 super() |
| 靜態塊中訪問實例字段 | 編譯報錯 | 編譯報錯 | 靜態上下文無 this 引用 |
| 實例塊中拋出檢查型異常 | 構造方法無需聲明 | 所有構造方法必須聲明 throws | 實例塊代碼被複製到每個構造方法 |
| 單例模式雙重檢查鎖 | 靜態塊初始化 instance | 靜態內部類或枚舉更安全 | 指令重排可能導致半初始化對象可見 |
掌握初始化順序,不僅是面試必考點,更是編寫健壯 Java 代碼、排查疑難初始化 Bug、設計優雅對象創建模式的基石。