public class Test2 {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
method(a, b);
System.out.println(a + "," + b); // 輸出:AB,B
}
static void method(StringBuffer x, StringBuffer y) {
x.append(y); // x 變為 "AB"
y = x; // y 變量指向 x 同一對象,但 main 中的 b 仍指向原 "B"
}
}

Java 只有值傳遞。 方法參數接收的是引用的副本。在方法內修改參數變量指向(如
y = x),不影響 調用方的原變量(b)。
| 階段 | main 棧幀 | method 棧幀 | 堆內存對象 |
|---|---|---|---|
| 調用前 | a → objA("A") b → objB("B") | — | objA: "A" objB: "B" |
| 進入 method | 同上 | x → objA y → objB | 同上 |
| x.append(y) | 同上 | x → objA("AB") y → objB | objA 變為 "AB" objB 仍為 "B" |
| y = x | 同上 | x → objA y → objA | 無新對象,y 只是換了指向 |
| 方法返回 | a → objA("AB") b → objB("B") | 銷毀 | objA: "AB" objB: "B" |
a 變為 "AB"。y 指向 x 同一對象,不改變 main 中 b 的指向。b,需返回新引用或使用包裝類/數組/AtomicReference。StringBuilder 非線程安全,但傳遞機制完全一樣,輸出結果同為 AB,B。
Holder<T>)、數組 StringBuffer[] holder = new StringBuffer[1]append、setLength 等)「引用傳值」是 Java 參數傳遞的鐵律。理解 棧上引用變量 與 堆上對象 的分離,即可秒懂所有類似題目。