boolean, byte, short, int, long, char, float, double(8 種),直接儲存值。null,可賦值給任何引用型別變數。| 術語 | 本質 | 中文慣用語 | 說明 |
|---|---|---|---|
| Variable / Handle | 棧上儲存的標識符 | 句柄 / 變數 | 本文稱「句柄」為引用型別變數名(如 A a; 中的 a) |
| Reference | 指向堆上物件的地址值 | 引用 | new A() 的回傳值,相當於物件的「身分證號」 |
| Object | 堆上實際佔用記憶體的實體 | 物件 / 實例 | 包含實例欄位、物件頭、對齊填充 |
Windows 的 Handle 是「指向指標的指標」,Java 的 Reference 直接指向物件(或透過 Handle Pool 間接指向,視 JVM 實作而定),兩者概念不同,切勿混淆。
// 記憶體圖解
棧帧 堆
+----------------+ +----------------+
| int k = 10 | | |
| A a ──────────+──────────►| Object@0x7f... | ← a 儲存的是引用(地址)
| String s ─────+──────────►| String@0x8a... |
+----------------+ +----------------+
| 比較方式 | 基本型別 | 引用型別 |
|---|---|---|
== |
比較數值 | 比較引用地址(即句柄值) |
equals() |
N/A | 預設同 ==;String、包裝類等重寫為內容比較 |
Vehicle veh1 = new Vehicle();
new Vehicle():在堆分配記憶體,初始化物件頭、實例欄位預設值(0/null/false)。Vehicle():執行欄位顯式賦值、初始化塊、建構子本體。Vehicle veh1:在棧分配句柄變數。=:將引用賦值給句柄,建立關聯。Vehicle veh2 = veh1; // 複製引用值,雙方指向同一堆物件
veh2 = new Vehicle(); // veh2 改指向新物件,veh1 不受影響
結論:一個句柄指向 0 或 1 個物件;一個物件可被 N 個句柄引用。
this()呼叫同類其他建構子時必須置於第一行;super()顯式呼叫父類建構子亦同。
理解「句柄在棧、物件在堆、引用連接兩者」是 Java 記憶體模型的基石。拋棄 C++ 指標思維,擁抱「引用即身分證」的物件導向觀,才能寫出無記憶體洩漏、高效能的 Java 程式。