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

StringBuffer append 參數傳遞機制深度解析:為什麼輸出 AB,B?

     編輯:程式設計綜合問答

代碼現場

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"

關鍵點總結

  1. x.append(y) 修改的是對象內部狀態,雙方共享同一對象,故 a 變為 "AB"。
  2. y = x 只是將方法局部變量 y 指向 x 同一對象,不改變 main 中 b 的指向。
  3. 若想在方法裡改變 main 的 b,需返回新引用或使用包裝類/數組/AtomicReference。

對比:StringBuilder 同理

StringBuilder 非線程安全,但傳遞機制完全一樣,輸出結果同為 AB,B。

避坑指南

  • ❌ 企圖在方法裡通過賦值改變實參引用
  • ✅ 需要「輸出參數」時:返回值、包裝類(Holder<T>)、數組 StringBuffer[] holder = new StringBuffer[1]
  • ✅ 只需修改對象內容時:直接調用實例方法(append、setLength 等)

總結

「引用傳值」是 Java 參數傳遞的鐵律。理解 棧上引用變量 與 堆上對象 的分離,即可秒懂所有類似題目。

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