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

Java 返回對象本質:返回的是引用(地址值),屬於引用傳遞

     編輯:程式設計疑難解答

Java 中方法返回對象時,實際返回的是對象引用的副本(即指向堆內存對象的地址值),屬於引用傳遞(按值傳遞引用)。

內存模型圖解

棧內存(方法幀)          堆內存
┌─────────────────┐      ┌──────────────┐
│ 方法參數/局部變量 │      │  對象實例     │
│  ref ──────────────────▶│  new Object() │
└─────────────────┘      └──────────────┘
      ▲
      │ 返回時:將 ref 的值(地址)複製給調用者的變量
      │
調用者棧幀
┌─────────────────┐
│ 返回值變量       │
│ ref_copy ──────────────▶ 同一個堆對象
└─────────────────┘

代碼驗證


public class Test {
  static class Node { int val; }
  
  static Node create() {
    Node n = new Node();  // 堆上創建對象
    n.val = 10;
    return n;  // 返回引用(地址值)
  }
  
  public static void main(String[] args) {
    Node a = create();  // a 接收返回的引用
    Node b = a;         // b 複製引用,指向同一對象
    b.val = 20;
    System.out.println(a.val);  // 輸出 20,說明 a、b 指向同一對象
  }
}

關鍵點總結

  1. 無「對象值傳遞」:Java 無法直接返回對象實體(不像 C++ 可返回 struct 觸發拷貝構造)。
  2. 返回的是引用副本:調用者拿到的變量存儲的是地址,指向同一堆對象。
  3. 屬於「按值傳遞」:Java 只有按值傳遞。對象傳遞時,值是引用(地址)。
  4. 生命周期:對象在堆上,由 GC 管理;引用在棧上,隨方法結束銷毀,不影響堆對象(除非無引用被 GC)。

參考資料

Java 參數傳遞深度解析

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