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

Java StringBuffer 參數傳遞與 append 操作導致打印結果差異解析

     編輯:程式設計疑難解答

問題現象

在 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 後,a 指向的對象已被修改為 "ABAB",而 b 仍指向未被修改的原始 "B" 對象。

驗證與建議

若需在方法內修改 main 中 b 的指向,可使用包裝類或返回新對象。理解引用傳遞與對象共享是關鍵。

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