在之前的學習中,我們習慣了「創建對象、調用方法」這套流程,卻鮮少探討對象在 JVM 內存中究竟如何存儲、如何被訪問。這一講將打破這層迷霧,引入 對象引用 這一核心概念,帶你透徹理解 Java 內存模型的運作機制。
沿用經典的 Human 類為例,當我們在 Test 類中編寫:
Human aPerson = new Human(160);
這行看似簡單的代碼,實則包含三個關鍵動作:
new 出來的)均駐留於此,不受單一方法生命週期限制,由垃圾回收器統一管理。int、double 等直接在棧上存儲數值本身,無需 new,變量名即代表數值。
當執行 Human dummyPerson = aPerson; 時,複製的是對象地址,而非對象本身。兩個引用指向同一堆對象,任一引用修改對象狀態,另一引用即可見到變化。
public class Test {
public static void main(String[] args) {
Human aPerson = new Human(160);
Human dummyPerson = aPerson; // 共享同一對象
System.out.println(dummyPerson.getHeight()); // 160
aPerson.growHeight(20); // 通過 aPerson 修改
System.out.println(dummyPerson.getHeight()); // 180,dummyPerson 同步看到變化
}
}
方法結束時,棧上的引用銷毀,但堆上對象仍存活。若無任何引用指向某對象(如圖中 Club Object),GC 判定其為「垃圾」並回收內存。核心原則:
可達性分析:從 GC Roots 出發,無引用鏈可達的對象即為可回收對象。
new 新對象並重新賦值給參數,則不影響外部原引用指向的對象。| 核心概念 | 關鍵點 |
|---|---|
| new | 在堆上創建對象,返回地址 |
| 引用 vs 對象 | 引用在棧,對象在堆;引用指向對象 |
| 引用賦值 | 複製地址,多引用共享一對象 |
| 垃圾回收條件 | 無任何引用指向(不可達) |
| 參數傳遞 | 值傳遞(基本類型傳值,引用類型傳地址) |