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

Java 中 new DerivedClass() 背後的完整初始化流程解析

     編輯:Java 相關知識

對象創建的深度剖析

當執行 new DerivedClass() 時,JVM 會經歷嚴格有序的初始化序列,涉及類加載、內存分配、構造器鏈調用等關鍵步驟。理解此過程對掌握繼承機制、靜態/實例初始化順序至關重要。

階段一:類加載與鏈接(按繼承鏈自頂向下)

  1. 加載基類: 遞歸觸發父類 BaseClass 的加載、驗證、準備、解析。
  2. 加載子類: 加載 DerivedClass,為類變量(static 字段)分配內存並賦默認值。
  3. 執行 <clinit>: 按源碼順序執行靜態變量顯式賦值語句與 static {} 靜態初始化塊,右值可為方法調用。

階段二:實例內存分配

為實例變量(非 static 字段)分配堆內存並設置默認值(0、null、false 等)。

階段三:構造器鏈調用(自頂向下)

  1. 調用父類構造器: Java 強制子類構造器首行顯式或隱式調用 super(),遞歸完成父類初始化。
  2. 執行 <init>: 按聲明順序執行實例變量顯式賦值與 {} 實例初始化塊。
  3. 執行構造器體剩餘代碼: 執行開發者編寫的構造器邏輯。

關鍵規則總結

  • 靜態初始化僅在類首次主動使用時執行一次,按繼承層級從父到子。
  • 實例初始化隨每次 new 發生,順序:父類靜態 → 子類靜態 → 父類實例 → 父類構造器體 → 子類實例 → 子類構造器體。
  • super() 必須為構造器首條語句,否則編譯器自動插入無參 super();若父類無無參構造器將導致編譯錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved