我們日常編寫 Java 程式時頻繁使用「物件」概念,但物件在記憶體中究竟如何儲存?理解物件參考是掌握 Java 記憶體模型、垃圾回收機制與參數傳遞行為的關鍵基石。
以簡單的 Human 類別為例:
public class Human {
private int height;
public Human(int h) { this.height = h; }
public int getHeight() { return height; }
public void growHeight(int h) { height += h; }
}
在 main 方法中建立物件:
Human aPerson = new Human(160);
這行程式碼背後發生了三件關鍵事:
aPerson 是參考型別變數,儲存在執行緒私有的堆疊記憶體new 建立物件的堆疊位址,賦值給左邊的參考變數
參考就像手中的風箏線,物件是天空中的風箏。程式碼中看到的是參考(風箏線),但實際操作的是物件(風箏)。所有存取物件的路徑都必須透過參考,Java 不允許直接操作記憶體位址(不像 C/C++ 的指標運算)。
Human dummyPerson = aPerson;

這行程式碼複製的是參考值(位址),而非物件本身。兩個參考指向同一個堆疊物件。透過任一參考修改物件狀態,另一個參考讀取時都會看到變化:
Human aPerson = new Human(160); Human dummyPerson = aPerson; System.out.println(dummyPerson.getHeight()); // 160 aPerson.growHeight(20); System.out.println(dummyPerson.getHeight()); // 180 - 受影響!
結論:參考賦值 ≠ 物件複製。若需複製物件,須實作 clone()、建構子複製或序列化等機制。
| 型別分類 | 儲存位置 | 變數代表 | 範例 |
|---|---|---|---|
| 基本型別 | 堆疊 | 數值本身 | int, double, boolean |
| 參考型別 | 參考在堆疊,物件在堆疊 | 物件位址 | String, Human, int[] |
基本型別宣告不需 new,JVM 直接在堆疊儲存數值;參考型別必須 new 在堆疊建立物件。

JVM 內建垃圾回收器(GC),核心原則:
Java 方法參數傳遞永遠是值傳遞:
void modify(Human h) {
h.growHeight(10); // 影響原物件 ✓
h = new Human(200); // 只改變區域參考 h,呼叫端不受影響 ✗
}
new = 在堆疊建立物件,回傳位址