public class Foo { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer a =new StringBuffer("pccw");
StringBuffer b =new StringBuffer("solutions");
operate(a,b);
System.out.println(a+","+b);
}
static void operate(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
}
该程序的结果是什么?

解决方案 »

  1.   

    结果为:pccw,solutions
    static void operate(StringBuffer x,StringBuffer y){
    x.append(y);
    y=x;
    }
    operate(a,b);方法,只是将a,b的副本传给了operate方法。
    在方法内部并没有修改a和b的值,只是对a和b的副本在操作。不会影响到a和b的值
      

  2.   

    但是我运行出来的结果的确是pccwsolutions,solutions??
      

  3.   

    你那就错了 StringBuffer是对象传递
    使用了append之后就改变了对象的引用
    但是直接=的话么有改变
    1楼的答案是对的
      

  4.   

    LZ你把StringBuffer换成String就不变了
      

  5.   

    又是这问题啊传递非基本类型参数时,传得一律是对象的地址。public static void main(String[] args) {
    StringBuffer a =new StringBuffer("pccw");
    StringBuffer b =new StringBuffer("solutions");
    // 1: a指向对象"pccw", b指向对象"solutions" (我这里就简写了,看得懂就行)
    operate(a,b);
    // 2: 调用operate方法,跳到下面
    System.out.println(a+","+b);
    // 8: 于是输出"pccwsolutions,solutions"
    }
    static void operate(StringBuffer x,StringBuffer y){
    // 3: 参数传进,由于传递的是地址,于是x也指向"pccw",y也指向"solutions"
    x.append(y);
    // 4: 调用StringBuffer的方法,那么x指向的对象"pccw"就变成了"pccwsolutions"
    y=x;
    // 5: y=x,将x的值赋值给y,也即y指向了"pccwsolutions"
    // 6: 但!这里的y和外面的b没有半毛钱关系!
    // 7: 参数调用的时候,仅仅是将b的值赋值给y而已,这里的y的变化不影响外面的b
    }
    }
      

  6.   

    在调用operate(a,b)的时候
    栈上在存储的是
    StringBuffer x和
    StringBuffer y两个对象引用的copy,也就是说a与x,b与y虽然都是指向同一个对象,但不是相同的引用,
    因为java里面所有的传递都是值传递在operate方法里面,a指向的对象调用一个append方法,所以x所指向的对象发生了变化,b只是指向的对象发生变化的,因为b与y是不同的引用的,所以y没有发生变化的