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

标签 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 (Second Syso)

我不知道为什么这会将所有内容附加到 a 中而不是 b 中。 我用谷歌搜索了很多,但它只会造成困惑。因此,如果有人完整地阐述它,那将会有很大的帮助。

提前致谢

P.S:-如果这个论坛已经有人问过这个问题,请给我一个链接,因为我找不到它。

最佳答案

是的,Java 总是按值传递,但您需要知道值是什么。对于对象,传递的值是对象的引用,而不是对象本身。请参阅Is Java "pass-by-reference" or "pass-by-value"?详细解释。

<小时/>

i am not sure why this is appending everything in a not in 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).

关于Java 使用按值调用,但在 StringBuffer 的情况下行为很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811437/

相关文章:

java - 在字符串中添加字符

java - 解析 '^M' 或 '\r' 字符行结尾的最佳位置/阶段

java - 如何使用jsp将html代码存储在字符串中

java - 使用 Tomcat 进行连接池时出现 SQLNestedException

java - 获取 Stringbuffer 中换行符开头的索引

java - 需要删除字符串中多余的方括号

java - react excel 文件下载损坏

java - 通过声明初始化类 DS 字段 - 在构造函数调用之前还是之后?

Java,生成文本

java - Stringbuffer,Stringbuilder什么时候用?