Java 類初始化順序是面試高頻考點,也是理解對象創建生命周期的基石。本文通過三大規則、完整代碼驗證、輸出分析,建立清晰的心智模型。
初始化順序鏈:
(靜態字段、靜態塊) → (實例字段、實例塊) → 構造器
同類別內,按定義順序從上到下交織執行。
public class InitialOrderTest {
public static String staticField = "靜態字段";
public String field = "字段";
static { System.out.println(staticField); System.out.println("靜態塊"); }
{ System.out.println(field); System.out.println("實例塊"); }
public InitialOrderTest() { System.out.println("構造器"); }
public static void main(String[] args) { new InitialOrderTest(); }
}
靜態字段 靜態塊 字段 實例塊 構造器
核心鐵律:父類靜態 → 子類靜態 → 父類實例 → 父類構造器 → 子類實例 → 子類構造器
class Parent {
public static String pStatic = "父類-靜態字段";
public String pField = "父類-字段";
static { System.out.println(pStatic); System.out.println("父類-靜態塊"); }
{ System.out.println(pField); System.out.println("父類-實例塊"); }
Parent() { System.out.println("父類-構造器"); }
}
public class SubClass extends Parent {
public static String sStatic = "子類-靜態字段";
public String sField = "子類-字段";
static { System.out.println(sStatic); System.out.println("子類-靜態塊"); }
{ System.out.println(sField); System.out.println("子類-實例塊"); }
SubClass() { System.out.println("子類-構造器"); }
public static void main(String[] args) { new SubClass(); }
}
父類-靜態字段 父類-靜態塊 子類-靜態字段 子類-靜態塊 父類-字段 父類-實例塊 父類-構造器 子類-字段 子類-實例塊 子類-構造器
靜態字段與靜態塊、實例字段與實例塊,按代碼中出現的順序交織執行。
public class TestOrder {
public static TestA a = new TestA(); // 1
public TestC c = new TestC(); // 4
public static TestB b = new TestB(); // 2
static { System.out.println("靜態塊"); } // 3
TestOrder() { System.out.println("構造器"); } // 5
public static void main(String[] args) { new TestOrder(); }
}
class TestA { TestA() { System.out.println("Test-A"); } }
class TestB { TestB() { System.out.println("Test-B"); } }
class TestC { TestC() { System.out.println("Test-C"); } }
Test-A Test-B 靜態塊 Test-C 構造器
先靜後動,先父後子,按序定義,構造收尾。
super(),無參構造器不存在則編譯錯誤int i = 10 是初始化,i = 10 是賦值,前者在初始化階段,後者在構造器ExceptionInInitializerError
class Trap {
static { value = 10; } // 合法:賦值
// System.out.println(value); // 非法:讀取在定義前
static int value = 20;
}
編譯器按文本順序做確定性賦值分析,讀取必須在定義後,賦值可在定義前(但不推薦)。
初始化順序本質是 JVM 類加載與對象創建的規範流程。掌握「靜態>實例、父>子、定義順序」三大鐵律,配合確定性賦值分析,即可破解所有初始化順序題。