public class Test {

public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
method(a, b);
System.out.println(a + "," + b);
}

static void method(StringBuffer x, StringBuffer y) {
x.append(y);
                           y = x;
}

}
请问为什么输出结果是AB,B??

解决方案 »

  1.   

    Java函数形参都是传值的。所以你在函数method中,对形参y进行重新复制,不会影响主调函数实参b。但你在函数method中,直接对形参x的对象进行操作(append),主调函数a引用的是同一个对象,当然看得到变化。
      

  2.   

    new StringBuffer("A"); 和 new StringBuffer("B"); 是两个对象,我们暂且叫它:对象A 和 对象BStringBuffer a 和 StringBuffer b 是主调函数的两个变量,我们就简称:变量a 和 变量bStringBuffer a = new StringBuffer("A"); 变量a 引用了 对象A
    StringBuffer b = new StringBuffer("B"); 变量b 引用了 对象B
    method(a, b); 调用函数method,并传递了两个变量a和b的值(这个值其实就是对象的引用,有点像C语言的指针值)static void method(StringBuffer x, StringBuffer y) { // 两个形参变量,简称:形参x 和 形参y
      // 注意,函数调用刚开始的时候,形参x得到了变量a的值,那么也就引用了对象A
      x.append(y); // 调用形参x所引用对象的append函数,那么其实可以理解为“对象A.append(对象B)”
      y = x; // 形参y转而去引用形参x值,那么形参y就指向了对象A
    }
    但是注意到形参x和形参y的引用的变化,并不会对变量a和变量b产生之间影响。因为他们本来就是毫无关系的4个变量。
    如果你还疑惑,可以在函数method最后增加一句话:
    y.append(y);
      

  3.   

    那请问  StringBuffer是干什么用的?
      

  4.   

    那直接String a=“a”不就得了么?为什么用那个
      

  5.   

    性能效率,空间效率。String是不可修改的,意味着每次做字符串组装,都要新生成对象。
    再结合形参的问题导致你不可能写一个函数实现类似于 add(String x, String y),然后调用结束后 x对应的实参能变成 x+y