public class Test    {
public static void main(String[] args){
   StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
  operater(a,b);
System.out.println(a+","+b);
}
public static void operater(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
                }
}答案是"AB,B"!请问下为什么变量a的值改变了,而变量b却不会改变?若想让b的
值也改变,原程序该怎么改?

解决方案 »

  1.   

    传入operater的是a和b的指针
    你在其中改变了y的指针,可是主函数里的b的指针没有跟着变啊
    当然还是B了
      

  2.   

    java的话还有指针这概念吗?!我问的就是为什么主函数里的b的指针没跟着改变?x的地址变了,y=x只是改变它的内容,而没改变它的地址吗?
      

  3.   

    java没有指针,但是也和指针差不多。
    StringBuffer是个类,所以a是个对象,传递的是引用。把operater(StringBuffer x, StringBuffer y)改为operater(final StringBuffer x, StringBuffer y)就不能运行啦。
      

  4.   

    看错啦,不好意思。:)y是b对象的引用,y虽然改变了,但是b并没有变。所以b输出的还是“B”
      

  5.   

    小伙子,先把语法看懂,不断的看,懂了也再看,你就能很清楚引用,压栈,退栈等问题了。
    但既然来了,还是说点,能改变引用所指的内容,但不能改变引用本身。另外要注意String的赋值,如String a = "a";String b = a;不要认为只有一个对象,其实产生了两个对象,java的String在赋值时复制内容,其他的对象赋值是传播引用。
      

  6.   

    operater(a,b) 后
    reference x指向reference a
    reference y指向reference by=x 后
    reference y指向reference a
    但reference a 并没有指向 reference b所以你方法里做的动作对打印没有起到作用
      

  7.   

    若要改变b程序这样改:public class Test    {
    public static void main(String[] args){
       StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
      operater(a,b);
    System.out.println(a+","+b);
    }
    public static void operater(StringBuffer x, StringBuffer y){
    x.append(y);
                      // 关键是这里,改变的是指针指向的内容
    y.delete(0, y.length());
                      y.append( x );
                    }
    }
      

  8.   

    你把这个函数的参数由 StringBuffer 改为 String 再看看结果,弄懂为什么是这个结果后你的理解就可以再深一个层次了
      

  9.   

    y = x;
    这个在Stringbuffer中是没有效果的
      

  10.   

    你一定要明白java在函数调用参数传递时是传的---值,在你的哪个例子中,a的值copy了一份给x,b的值copy了一分给y,不过由于a,b都是引用,所以现在x指向a指向的对象,y指向b指向的对象.当函数执行过程中,x所指向的对象被改变了,所以a所指向的对象也改变了,因为他们是一个对象.而对于y来说,y=x改变了y这个引用,但是没有改变它曾经指向的对象,y现在指向一个新对象了(a指向的对象),在这个过程中,b所指向的对象没有发生任何改变,所以当函数返回后b指向的对象还是原来的.我所说的指向其实就是引用,先声明一下,省得有人又说java里面哪有指针.
      

  11.   

    怎么又是这个问题啊,有人问过了,我也回答过了,看看下面的链接
    http://community.csdn.net/Expert/topic/4236/4236928.xml?temp=.9343988首先你要弄明白,函数里对参数的操作,实际上是对参数的拷贝操作,也就是编译器会自动创建一个引用,指向和参数(也就是函数外的对象)相同的一块内存地址,在函数里操作的参数对象,实际上是这个被创建出来的引用,调用x.append(y);修改了x引用的内存信息,而x和函数外的a引用指向相同的地址,所以a也变了,而调用y = x;改变了函数里被创建出来的参数拷贝的引用的指向,也就是y指向了新的内存地址,但函数外的b并没有指向新的内存地址,b还是引用原来的内存信息,所以函数外的b没有改变。