首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 物件引用與垃圾回收:為何設為 null 仍能呼叫方法?

     編輯:程式設計綜合問答

現象

MyClass c = new MyClass();
MyClass cc = c;
remove(cc); // 內部將參數設為 null
c.sayHello(); // 仍正常執行!

核心概念:Java 是「傳值呼叫」

Java 只有傳值呼叫。物件變數儲存的是「參考值」(記憶體位址)。

  • cc 與 c 指向同一個 MyClass 實例。
  • 呼叫 remove(cc) 時,參數 x 獲得 cc 的參考值副本。
  • 在 remove 內部 x = null 僅改變區域變數 x 的副本,不影響 外部的 cc 或 c。

記憶體示意

堆疊:main()        c  ──────┐
                         │    │ 參考值 0x100
堆疊:remove()     x  ──────┘    ▼
堆積:                 MyClass 實例 (0x100) ◄───── 未被回收

如何真正讓物件符合 GC 回收條件?

  1. 將所有指向該物件的變數設為 null:c = null; cc = null;
  2. 或讓變數超出作用域(如方法結束、離開代碼塊)。
  3. 若需大量建立/釋放同類物件,考慮物件池模式重用實例,減少 GC 壓力。

常見誤區

「Java 是傳引用呼叫」──錯誤。Java 傳遞的是引用的值(位址副本),而非引用本身。

補充:finalize() 已棄用

Java 9 起 Object.finalize() 標記為棄用,請改用 try-with-resources 或 Cleaner 管理非記憶體資源。

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