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() 不影響。