Java 为什么这段代码没有给出预期的输出

Java 为什么这段代码没有给出预期的输出,java,stringbuffer,Java,Stringbuffer,我希望输出为AB,ABCD,但输出为ABCD,B。这怎么可能 public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer("A"); StringBuffer b = new StringBuffer("B"); operate(a,

我希望输出为AB,ABCD,但输出为ABCD,B。这怎么可能


    public class Test {
           public static void main(String[] args) {
                 StringBuffer a = new StringBuffer("A");
                 StringBuffer b = new StringBuffer("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");
           }
    }


所以最初,你有这个

a -> [A...]         b -> [B...]
然后,当您调用
operate
时,您会得到两个新变量,它们引用相同的两个
StringBuffer
对象

a                   b 
   ->  [A...]          ->  [B...]
x                   y
然后将一个
StringBuffer
的内容附加到另一个

a                     b 
   ->  [AB...]           ->  [B...]
x                     y
然后将另一个字母附加到第一个
StringBuffer
,并重新指向变量
y
,使其现在引用与
a
x
相同的
StringBuffer

a                      
x  ->  [ABC...]        b   ->  [B...]
y                     
然后再添加一个字母,现在将第一个
StringBuffer
引用为
y

a                      
x  ->  [ABCD...]        b   ->  [B...]
y                     

然后退出
operate
并打印出两个
StringBuffer
对象的内容。

您似乎认为
x.append(y)
返回存储在
x
中的新字符串,但它没有返回。看,只需将指针返回到x

a                   b 
   ->  [A...]          ->  [B...]
x                   y

现在,根据这一点,再次阅读您的代码,看看您是否理解了输出

你调试代码了吗?你知道你的代码中有一个x.append(“C”),那么你怎么不希望a中有“C”呢?我不清楚该怎么回答。我只是通过读取代码来获取当前输出。您有什么意外?@TimBiegeleisen您能帮我处理输出ABCD,B吗。我的意思是,当我们在方法中操作时,在方法的末尾,a和b的值分别是ABCD和ABCD,但在函数结束后,其值变成ABCD,b。您将
x=a
y=b
传递给
operate()
方法。然后将
B
附加到第一行的
A
,给出
x=AB
。然后,在第二行和第三行,你应该注意像“global”这样的描述,因为Java没有全局变量