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

Java 參數傳遞機制:物件屬性修改 vs 參考傳遞的本質區別

     編輯:程式設計綜合問答

Java 唯有值傳遞。當方法參數為物件參考型別時,傳遞的是「參考的副本」(即記憶體地址值)。在方法內修改物件的屬性會影響原物件,但將參數重新指向新物件(如 param = new Obj())則不會影響外部原變數。這與 C++ 的指標/參考傳遞有本質不同。

程式碼示範

public class Test {
    static class User { String name; }
    
    public static void main(String[] args) {
        User u = new User(); u.name = "A";
        modifyAttr(u);      // 修改屬性
        System.out.println(u.name); // 輸出 "B" -> 原物件被改變
        
        reassign(u);        // 嘗試重新指向
        System.out.println(u.name); // 仍輸出 "B" -> 外部變數 u 未變
    }
    
    static void modifyAttr(User user) {
        user.name = "B"; // 通過副本參考找到同一物件,修改屬性
    }
    
    static void reassign(User user) {
        user = new User(); // 區域變數 user 指向新物件
        user.name = "C";   // 原物件 u 不受影響
    }
}

核心觀念對照

操作Java 行為C++ 指標傳遞C++ 參考傳遞
修改物件屬性/成員影響原物件影響原物件影響原物件
參數重新指向/賦值新物件不影響外部變數不影響外部指標(除非傳指標的指標)影響外部變數(別名)
交換兩個物件變數無法在方法內完成傳指標的指標可完成傳參考可完成

為何說「修改屬性不是參考傳遞」

參考傳遞的定義是:形式參數成為實際參數的別名,對形式參數的任何操作(包括重新賦值)都直接作用於實際參數。Java 中形式參數重新賦值斷開與實際參數的關聯,故非參考傳遞。這只是「傳遞參考的值」(Call by Value of Reference),通稱值傳遞。

實務建議

  • 若需在方法中修改呼叫端的變數本身(如交換、工廠方法回傳新物件),請回傳新物件或使用包裝類別(如 AtomicReference、自訂 Holder<T>)。
  • 不可變物件(String、Integer、LocalDate 等)天然安全,無「修改屬性」操作。
  • 集合/Map 等可變容器傳入方法時,清空/新增/刪除元素會影響原容器,但 list = new ArrayList() 則不影響。

徹底理解「值傳遞參考」機制,能避免 Java 開發中關於參數修改的邏輯錯誤。

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