package test;public class Test { /**
 * @param args
 */
public static void main(String[] args) {

StringBuffer a = new StringBuffer("A");

StringBuffer b = new StringBuffer("B");

change(a,b);

System.out.println(a+":"+b); }


static void change(StringBuffer x, StringBuffer y){

x.append(y);

y = new StringBuffer("aaaaa");




}}
上面代码会输出什么结果?为什么?高手请详细解释一下!

解决方案 »

  1.   

    x会变化,y不会变化。
    因为调用了x的方法,x中的状态变了
    没有调用y中的方法,仅仅对局部变量y重新赋值,原y没有变化。
      

  2.   

    java方法参数传值,不传指针,你可以用set改变对象的内部属性,不能用new改变对象的引用
      

  3.   

    x.append(y);
    这个真的改变了x指向的内容y = new StringBuffer("aaaaa");
    这个不会改变原始的对象。
      

  4.   

    还是有点不明白
    java方法参数传值,不传指针
      

  5.   

    楼上几位的解释是正确的,也就是输出AB:B
    StringBuffer是个类类型的,传的是指针,所以形参x改变,原来的a也改变了(因为传的是指针),但是你又让形参y重新指向了一个新的对象(y = new StringBuffer("aaaaa");),所以y的值是字符串"aaaaa",但原有的实参b并不会发生变化,还是字符串"B",所以输出的是AB:B
      

  6.   

    输出:AB:B
    -------
    因为:传递StringBuffer的时候,change函数的参数是引用传递,实际上传递的是这个对象的内存地址。
    在change函数中,对x参数进行了append操作,但是指针地址还是指向参数a的地址,所以x变化后a的值也变了。
    而在change函数,对y进行了new一次,java中每次new的时候就会申请一块新的内存地址,当我们对y进行重新new的时候,y所指向的内存地址已经指向了另一块内存地址,对y的任何操作都不会影响到b的值,因为两个对象的地址已经不一样了,所以b的值不会改变。
      

  7.   

    传值,传地址,形参,实参的问题。又复习了。这些问题很基本,有时候容易忘记。其实实际动手很容易发现的,打开Eclipse,单步执行,看看对象的地址映像就深刻了。关键还是要亲自动手:)