MyClass c = new MyClass();
MyClass cc = c;
remove(cc); // 內部將參數設為 null
c.sayHello(); // 仍正常執行!
Java 只有傳值呼叫。物件變數儲存的是「參考值」(記憶體位址)。
cc 與 c 指向同一個 MyClass 實例。remove(cc) 時,參數 x 獲得 cc 的參考值副本。remove 內部 x = null 僅改變區域變數 x 的副本,不影響 外部的 cc 或 c。
堆疊:main() c ──────┐
│ │ 參考值 0x100
堆疊:remove() x ──────┘ ▼
堆積: MyClass 實例 (0x100) ◄───── 未被回收
null:c = null; cc = null;「Java 是傳引用呼叫」──錯誤。Java 傳遞的是引用的值(位址副本),而非引用本身。
Java 9 起 Object.finalize() 標記為棄用,請改用 try-with-resources 或 Cleaner 管理非記憶體資源。