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");
    }
}

以上代码的输出是:ABCD,B(第二系统)

我不确定为什么这会将所有内容附加到 A 而不是 B 中。我用谷歌搜索了很多,但这只会造成混乱。因此,如果有人完全详细说明,那将是非常有帮助的。

提前致谢

PS:-如果在这个论坛上已经问过这个问题,请给我一个链接,因为我找不到它。

是的,Java总是按值传递的,但你需要知道值是什么。对于对象,传递的值是对对象的引用,而不是对象本身。请参阅 Java 是"按引用传递"还是"按值传递"?以获取详细说明。


我不确定为什么这会将所有内容附加到 A 而不是 B 中。

因为这个:

x.append(y);
y = x.append("C");
y.append("D");

与此完全相同:

x.append(y);
x.append("C");
x.append("D");

由于StringBuilder#append()返回this,因此将分配给y

y = x.append("C");

用对x(又名a)的引用覆盖传入(b)的对象的引用

当你这样做时:

 y = x.append("C");

所有发生的事情只是让 x 和 y 具有相同的引用(对于 x)。在那次手术之后,你在y上所做的一切都只是在x上做的。所以,最后这三个操作都发生在x上,就像Matt Ball说的:

x.append(y);
x.append("C");
x.append("D");

x应该是"ABCD",y不应该改变。

相关内容

最新更新