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

Java 物件創建與初始化深度解析:棧、堆、引用、句柄全景圖

     編輯:Java 相關知識

資料類型三大類

  1. 基本型別:boolean, byte, short, int, long, char, float, double(8 種),直接儲存值。
  2. 引用型別:類別型別(含陣列)、介面型別,儲存「引用」。
  3. null 型別:僅有一個值 null,可賦值給任何引用型別變數。

核心術語釐清

術語本質中文慣用語說明
Variable / Handle棧上儲存的標識符句柄 / 變數本文稱「句柄」為引用型別變數名(如 A a; 中的 a)
Reference指向堆上物件的地址值引用new A() 的回傳值,相當於物件的「身分證號」
Object堆上實際佔用記憶體的實體物件 / 實例包含實例欄位、物件頭、對齊填充
Windows 的 Handle 是「指向指標的指標」,Java 的 Reference 直接指向物件(或透過 Handle Pool 間接指向,視 JVM 實作而定),兩者概念不同,切勿混淆。

記憶體模型:棧 vs 堆

  • 棧:線程私有,儲存基本型別值、引用型別變數(句柄)、方法幀。生命週期隨方法進出自動管理。
  • 堆:線程共享,儲存物件實例、陣列。由 GC 管理,區分新生代/老年代。
// 記憶體圖解
棧帧                          堆
+----------------+           +----------------+
| int k = 10     |           |                |
| A a  ──────────+──────────►| Object@0x7f... |  ← a 儲存的是引用(地址)
| String s  ─────+──────────►| String@0x8a... |
+----------------+           +----------------+

== vs equals() 本質差異

比較方式基本型別引用型別
== 比較數值 比較引用地址(即句柄值)
equals() N/A 預設同 ==;String、包裝類等重寫為內容比較

物件創建與初始化完整流程

Vehicle veh1 = new Vehicle();
  1. new Vehicle():在堆分配記憶體,初始化物件頭、實例欄位預設值(0/null/false)。
  2. 呼叫建構子 Vehicle():執行欄位顯式賦值、初始化塊、建構子本體。
  3. Vehicle veh1:在棧分配句柄變數。
  4. =:將引用賦值給句柄,建立關聯。

多句柄指向同一物件

Vehicle veh2 = veh1;  // 複製引用值,雙方指向同一堆物件
veh2 = new Vehicle(); // veh2 改指向新物件,veh1 不受影響

結論:一個句柄指向 0 或 1 個物件;一個物件可被 N 個句柄引用。

物件初始化順序(含繼承)

  1. 父類靜態欄位/靜態區塊(按聲明順序)
  2. 子類靜態欄位/靜態區塊
  3. 父類實例欄位/實例初始化塊
  4. 父類建構子
  5. 子類實例欄位/實例初始化塊
  6. 子類建構子
this() 呼叫同類其他建構子時必須置於第一行;super() 顯式呼叫父類建構子亦同。

總結

理解「句柄在棧、物件在堆、引用連接兩者」是 Java 記憶體模型的基石。拋棄 C++ 指標思維,擁抱「引用即身分證」的物件導向觀,才能寫出無記憶體洩漏、高效能的 Java 程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved