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

Why this code is not giving the output as expected

我原以为输出是 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,这样它现在引用与 ax.

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

然后您再附加一个字母,现在将第一个 StringBuffer 引用为 y

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

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

您似乎认为 x.append(y) return 新字符串存储在 x 中,但事实并非如此。查看 here,并看到它只是 return 指向 x 的 指针。

现在有了这种洞察力,再次阅读您的代码并了解您对输出的理解。