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

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

     編輯:Java 相關知識

核心規則:父靜態 -> 子靜態 -> 父實例/構造 -> 子實例/構造

類載入與初始化遵循嚴格順序,理解此機制對調試複雜繼承體系、單例模式、靜態工廠至關重要。

標準輸出順序驗證


class Parent {
    static String name = "hello";
    static { System.out.println("1. parent static block"); }
    { System.out.println("3. parent instance block"); }
    public Parent() { System.out.println("4. parent constructor"); }
}

class Child extends Parent {
    static String childName = "hello";
    static { System.out.println("2. child static block"); }
    { System.out.println("5. child instance block"); }
    public Child() { System.out.println("6. child constructor"); }
}

public class InitOrderTest {
    public static void main(String[] args) {
        new Child(); // 唯一觸發點
    }
}

/* 輸出:
1. parent static block
2. child static block
3. parent instance block
4. parent constructor
5. child instance block
6. child constructor
*/

詳細階段拆解

階段觸發時機執行內容順序
父類靜態初始化Child 類首次被主動使用 (new、靜態方法、靜態欄位)靜態欄位賦值、靜態塊 static {}1
子類靜態初始化緊接父類靜態完成靜態欄位賦值、靜態塊2
父類實例初始化new Child() 分配記憶體後,隱式 super() 前實例欄位賦值、實例塊 {}3
父類構造器實例初始化完成構造器代碼4
子類實例初始化父構造器返回後實例欄位賦值、實例塊5
子類構造器最後構造器代碼6

關鍵細節

  • 靜態塊/欄位:類載入階段 (Class Loading) 執行,**僅一次**,線程安全由 JVM 保證 (ClassLoader 鎖)。
  • 實例塊:每次 new 都執行,編譯器將其複製到**每個構造器開頭**,super() 之前。
  • 隱式 super():子類構造器首行必須調用父構造器 (顯式或隱式),構成鏈式調用。
  • 欄位初始化順序:靜態欄位/塊按聲明順序 -> 實例欄位/塊按聲明順序。
  • final 靜態常量:編譯期常量 (基本型別/String) 在編譯期內聯,不觸發類初始化。

實戰陷阱案例


class Trap {
    static int i = 10;
    static { i = 20; }
    static int j = i; // j = 20
}
class Sub extends Trap {
    static { System.out.println(i); } // 輸出 20 (父類已初始化完成)
}
  • 循環引用導致類初始化死鎖 (極少見但可能)。
  • 靜態塊中拋出異常 -> 類初始化失敗 -> 後續使用拋 NoClassDefFoundError (包裝原始 ExceptionInInitializerError)。

最佳實踐

  1. 靜態塊僅做**無副作用、快速、確定性**初始化 (常量表、查找表、註冊驅動)。
  2. 複雜資源初始化 (連接池、線程池、配置解析) 改為**延遲初始化** (Holder 模式、雙重檢查鎖)。
  3. 避免在靜態塊中啟動線程、執行耗時 I/O、依賴外部服務。
  4. 繼承體系中,父類靜態邏輯盡量獨立,減少子類載入時的副作用面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved