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;
}
}请问为什么输出  AB,B  呢。。求详解。。

解决方案 »

  1.   

        static void operate(StringBuffer x, StringBuffer y) {
            StringBuffer z = x.append(y);
            System.out.println(z);
            y = x;
        }不知可不可以这么理解
      

  2.   

    operate(a, b); static void operate(StringBuffer x, StringBuffer y) {
            x.append(y);
            y = x;
        }中x跟a指向同一个StringBuffer,y和b是指向同一个StringBuffer,y=x,只是将y的指向变为x和a指向的StringBuffer,并没有改变b的指向。
      

  3.   

    又是这个问题,解释太多次了
    LZ先想一想,main方法的a,b和operate的x,y是相同的变量吗?想清楚你就知道了
    每个方法有自己的栈,每个局部变量属于自己的方法栈
    方法调用的时候,只是把a,b的值复制给x,y,也就是a,b的内存信息和x,y的内存信息一样,换句话说,就是a,b引用的对象和x,y引用的对象相同
    所以
    x.append(y);
    让x引用的对象的内容追加一个y,而a和x引用相同的对象,所以相当于a也发生了变化
    y=x
    让y引用x所引用的对象,b和y是不同的变量,此时它们分别引用不同的变量,所以此时对y做任何操作也不会影响b
      

  4.   

    我的理解是:
    先是有两个StringBuffer对象 a和b
    然后调用了oprate方法
    调用的oprate临时创建了两个StringBuffer对象 x和y  x拿了a对象的地址  y拿了b对象的地址
    然后x.append(y);
    也就是x对象调用了append()方法,变成了AB,x和a的地址都是一样的,所以调用的对象也都是同一个,也就是a对象变成了AB
    然后y=x  是y对象赋上了x对象的地址
    最后oprate方法结束 x和y对象释放 内存里还是只有a和b对象  然而a对象在 operate 方法中调用过 变成了AB 而b没有调用过 ~~~
    于是 a和b的值 分别是 AB 和B