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

Java 對象初始化全流程:類加載、內存分配、字段賦值、構造器執行順序深度解析

     編輯:Java 綜合教學

Java 對象初始化全流程:類加載、內存分配、字段賦值、構造器執行順序深度解析

從 `new A()` 到對象可用,JVM 經歷嚴格的 6 步驟;繼承體系下,父子類靜態/實例成員、構造器執行順序更有嚴格規範。本文系統梳理全流程與順序規則。

單一對象創建 6 步驟

  1. 類加載:首次主動使用類(new/靜態字段/靜態方法/反射)時,類加載器查找 `A.class`,載入方法區。
  2. 靜態初始化:執行靜態字段賦值、靜態代碼塊(`static {}`),**僅執行一次**,按源碼順序。
  3. 堆內存分配:在堆中劃分對象大小內存區域(指針碰撞/空閒列表),佈局含對象頭、實例數據、對齊填充。
  4. 默認值初始化:內存區域清零 → 基本類型 0/false、引用類型 null。
  5. 顯式字段初始化:執行實例字段聲明處賦值、實例代碼塊(`{}`),按源碼順序。
  6. 構造器執行:調用 `` 方法,執行構造器體代碼,對象正式可用。

繼承體系初始化順序(核心考點)

1. 父類靜態字段/靜態代碼塊(按代碼順序)
2. 子類靜態字段/靜態代碼塊(按代碼順序)
3. 父類實例字段/實例代碼塊(按代碼順序)
4. 父類構造器(隱式/顯式 super())
5. 子類實例字段/實例代碼塊(按代碼順序)
6. 子類構造器

代碼驗證範例

class Parent {
    static { System.out.println("Parent static"); }
    { System.out.println("Parent instance block"); }
    Parent() { System.out.println("Parent constructor"); }
}
class Child extends Parent {
    static { System.out.println("Child static"); }
    { System.out.println("Child instance block"); }
    Child() { System.out.println("Child constructor"); }
}
public class Test { public static void main(String[] args) { new Child(); } }

輸出:

Parent static
Child static
Parent instance block
Parent constructor
Child instance block
Child constructor

關鍵規則總結

  • 靜態初始化**類加載時**完成,全程**單線程安全**(類加載器鎖保證)。
  • 構造器鏈:子類構造器**首行必須**顯式/隱式調用 `super(...)`,否則編譯錯誤;父類無無參構造器時**必須**顯式調用帶參 `super(...)`。
  • 實例代碼塊 `{}` 在每次 `new` 時執行,早於構造器體,適合多構造器共享初始化邏輯。
  • 字段聲明賦值 = 實例代碼塊 = 構造器參數賦值,三者按源碼順序交織執行。

構造器設計準則(Effective Java / Java 编程思想)

  1. 使對象進入合法狀態:構造器只做必要初始化,避免調用可覆寫方法(洩露 `this` 引用)。
  2. 安全調用點:構造器內僅調用 `final`/`private`/`static` 方法,防止子類覆寫導致未完全構造對象被使用。
  3. 不可變對象:所有字段 `final`,構造器一次性賦值,無 setter,線程安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved