首先,你知道x的结果是正确的,我就不解释了。下面说y 为什么是"B"
 y=x;这条是在 operate()这个函数内部的,也就是在operate()内改变了一个引用的对象,那么,在operate()的域结束后,被改动的引用将指向原来的引用。
在这里,也就是y又重新指向了"B"这个对象。

解决方案 »

  1.   

    void operate (StringBuffer x, StringBuffer y) {
     x.append (y);
     y = x;
     }
    相当于
    void operate (StringBuffer x,StringBuffer y){
     StringBuffer a=x;
     StringBuffer b=y;
     a=a.append(b);
     b=a;
    }
      

  2.   

    谁说不能了~ 可以改变它的指向,也可以改变实参的内容但,如果你传参是: final StringBuffer x 
    那么,就不能改变它的指向了,但还是可以改变它的内容。
      

  3.   

    java的函数参数传值,也就是说a、b的引用被拷贝到参数中,虽然x = y;,但并不影响a和b各自的指向对象。
      

  4.   

    如果楼主编过C++,那么……在上面的代码中
    operate函数原型等于C++里的:
    static void operate(StringBuffer *x, StringBuffer *y) ;
    (假设C++里有StringBuffer这种数据类型)
    然后通过operate(&a, &b)调用
    a,b实际上都是指向某个StringBuffer的指针
    调用operate函数时是将两个分别等于a,b的两个新的指针传递到函数内部
    对新的指针进行操作
    所以用x.append()能改变a和x共同指向的那个对象
    但y=x改变的是y指针,不改变b指针而楼主原来对该代码的理解则是:
    operate函数原型等于C++里的:
    static void operate(StringBuffer &x, StringBuffer &y) ;
    然后通过opearte(a,b)调用不太明的是,后者是在operate函数里对a,b指针直接进行操作?
    好象不太可能……
    还是在函数执行完成后将原a,b的指针指向新的指针?
      

  5.   

    有句说得不太准确:
    “调用operate函数时是将两个分别等于a,b的两个新的指针传递到函数内部”
    应该改为“调用operate函数时是将两个分别与a,b指针指向相同的两个新的指针传递到函数内部”哎……不好意思~
    本人语文考试一向都只是在及格边缘的……
      

  6.   

    java传参数都是传值(在这方面还有争论),传值就意味则传递的局域性副本
    基本类型,传就是本身对象的值
    在类对象的时候,由于java中的对象是通过引用进行操作的,a,b就是引用。
    所以在operate传参数中,x=a的副本 y=b的副本,
    函数中改变了x所指向对象,也就是a所指向的对象,对象是没有作用域限制的,所以a的对象也就改变了
    函数中y=x,也就是y=a的副本了,可是y 并没有对b所指向的对象进行操作
      

  7.   

    babywhite说得太好了,同样谢谢各位
      

  8.   

    想改变reference的内容,可以再void函数里面实现
    如果想改变一个reference的指向,你得把这个reference返回。