首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 參數傳遞陷阱:方法調用中對象參數的可變與不可變行為差異

     編輯:Java 相關知識

核心結論

Java 採用值傳遞,但傳遞的是引用的值。方法內修改引用指向的對象內容會影響外部;但重新賦值引用(指向新對象)則不影響外部。可變對象與不可變對象表現截然不同。

案例一:可變對象


class Value { public int i = 15; }
class TestValue {
    Value v = new Value();
    void first() {
        System.out.println(v.i); // 15
        second(v);  // 修改對象內容
        System.out.println(v.i); // 20
        third(v);   // 重新賦值引用
        System.out.println(v.i); // 20
    }
    void second(Value v) { v.i = 20; } // 修改同一對象
    void third(Value v) {
        v = new Value(); // 參數 v 指向新對象
        v.i = 25;        // 修改新對象,不影響外部 v
    }
}

輸出: 15 → 20 → 20

案例二:不可變對象


class TestInteger {
    Integer v = new Integer(15);
    void first() {
        System.out.println(v); // 15
        second(v);  // 嘗試修改
        System.out.println(v); // 15
        third(v);   // 重新賦值
        System.out.println(v); // 15
    }
    void second(Integer v) {
        v = 20; // 自動拆箱/裝箱生成新 Integer,參數 v 指向新對象
    }
    void third(Integer v) {
        v = new Integer(25); // 參數 v 指向新對象
    }
}

輸出: 15 → 15 → 15

關鍵點: Integer 不可變,v = 20 實際是 v = Integer.valueOf(20),生成新對象,原對象未變。

運行結果完整對照


15
true
20
false
20
15
true
false
15
false
15

前五行為可變對象測試,後六行为不可變对象测试。true/false 表示参数引用与成员引用是否指向同一对象。

避坑指南

  • 不可變類型:String、包裝類、BigDecimal 等,方法內「修改」實為創建新對象。
  • 需修改外部引用指向?無法直接實現,可返回新對象或使用容器/數組包裝。
  • 集合/數組屬可變對象,方法內 add/remove/set 影響外部;但 list = new ArrayList() 不影響。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved