Java 只有值傳遞。基本類型傳值副本,引用類型傳引用副本(地址值),但引用指向同一對象。
static class Value { String val = "old"; }
public static void newValue(Value v) {
v = new Value(); // 修改局部引用指向
v.val = "new";
System.out.println("方法內: " + v.val + " hash=" + v.hashCode());
}
public static void modifyValue(Value v) {
v.val = "new"; // 修改對象內部狀態
System.out.println("方法內: " + v.val + " hash=" + v.hashCode());
}
public static void main(String[] args) {
Value v1 = new Value();
System.out.println("調用前: " + v1.val + " hash=" + v1.hashCode());
newValue(v1);
System.out.println("調用後: " + v1.val + " hash=" + v1.hashCode()); // 未變
Value v2 = new Value();
System.out.println("調用前: " + v2.val + " hash=" + v2.hashCode());
modifyValue(v2);
System.out.println("調用後: " + v2.val + " hash=" + v2.hashCode()); // 已變
}
調用前: old hash=12677476 方法內: new hash=33263331 調用後: old hash=12677476 ← newValue 未影響外部 調用前: old hash=6413875 方法內: new hash=6413875 調用後: new hash=6413875 ← modifyValue 修改了同一對象
v = new Value())只改變棧中副本,不影響實參引用setXxx() 修改堆對象內容,外部可見// newValue
ref_copy = ref_original; // 複製引用地址
ref_copy = new Value(); // 指向新對象
ref_copy.setVal("new"); // 操作新對象
// modifyValue
ref_copy = ref_original; // 複製引用地址
ref_copy.setVal("new"); // 操作原對象