Java使用值调用,但在StringBuffer的情况下使用奇怪的行为

Aru*_*run 0 java stringbuffer

我是java技术的新手,可能是一个简单的问题,但我很困惑.我知道java中没有引用调用的概念.它只使用按值调用,即将副本传递给另一个方法

请检查以下代码的输出

public class Test {

    public static void main(String[] args) {
        StringBuffer a = new StringBuffer ("A");  
        StringBuffer b = new StringBuffer ("B");
        System.out.println("Before Operate"+a + "," +b);
         operate (a,b);
        System.out.println(a + "," +b);
    }
     static void operate (StringBuffer x, StringBuffer y) {
     x.append(y);
     y = x.append("C");
     y.append("D");
    }
}
Run Code Online (Sandbox Code Playgroud)

以上代码的输出为:ABCD,B(Second Syso)

我不知道为什么这会把所有东西都追加到b中.我google了很多,但它只会造成混乱.如果有人完全详细说明,那将会很有帮助.

提前致谢

PS: - 如果已经在这个论坛上被问到,请给我一个链接,因为我无法找到它.

Mat*_*all 10

是的,Java始终是按值传递的,但您需要了解其价值.对于对象,传递的值是对象的引用,而不是对象本身.请参阅Java是"传递引用"还是"按值传递"?详细解释.


我不知道为什么这会把所有东西都追加到b中.

因为这:

x.append(y);
y = x.append("C");
y.append("D");
Run Code Online (Sandbox Code Playgroud)

与此完全相同:

x.append(y);
x.append("C");
x.append("D");
Run Code Online (Sandbox Code Playgroud)

由于StringBuilder#append()回报率this,使分配给y

y = x.append("C");
Run Code Online (Sandbox Code Playgroud)

使用对(aka )的引用覆盖对(b)传入的对象的引用.xa