在 Java 中,StringBuffer 作為可變字符串對象,其參數傳遞機制常引發困惑。以下代碼展示了兩次打印結果不一致的情況:
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println("main方法:" + a + "," + b);
}
private static void operator(StringBuffer a, StringBuffer b) {
a.append(b); // a 變為 "AB"
b = a; // b 現在指向 a 同一個對象
b.append(a); // 等同於 a.append(a),a 變為 "ABAB"
System.out.println("operator:" + a + "," + b);
}
輸出結果:
operator:ABAB,ABAB
main方法:ABAB,B
Java 採用值傳遞,但傳遞的是對象引用的副本。
a.append(b):修改了 main 中 a 指向的對象內容,變為 "AB"。b = a:在 operator 方法內部,參數 b 的引用被重新指向 a 所指的對象。此時 main 中的 b 仍指向原始的 "B" 對象,未受影響。b.append(a):因 b 和 a 指向同一對象,相當於 a.append(a),導致 a 變為 "ABAB"。operator 內的打印顯示兩者皆為 "ABAB"。若需在方法內修改 main 中 b 的指向,可使用包裝類或返回新對象。理解引用傳遞與對象共享是關鍵。