我觉得是y是和b指向同一个对象,x和a指向同一个对象,
x.append(y);使x="AB"即a="AB"
y=x使y指向了x也就是a(这个过程中b的值没变)
所以打印a,b会是AB,B

解决方案 »

  1.   

    最一开始y-b,x-a值得是同一个对象
    而在operator方法中
    x=AB y=x=AB
    而由于b并未参与其中
    所以打一结果为AB B
    可以了解一下整个程序中的各个变量的指向
      

  2.   

    Java中的形参是以传值引用,但是StringBuffer的append方法是在原有的X的地址上,加上了Y,所以传进来的参数改变,而Y是不会改变的
      

  3.   

    楼主,先弄清楚pass by value和pass by reference的区别.再看看你的operator方法操作y和原来的b有什么关系?StringBuffer  a  --------> [A]
    StringBuffer  b  --------> [B]
    初始化之后为以上,调用operator方法,传递的是引用,所以:
    StringBuffer  x = a ---------> [A]
    StringBuffer  y = b ---------> [B]
    进入operator方法之后为以上所示.
    执行x.append(y)和y=x之后呢?
    StringBuffer  x = a ---------> [AB]
    StringBuffer  y = x = a -----> [AB]
    看看,这里b的内容并不会被改变.
      

  4.   

    BTW, 你的疑问实际上不是StringBuffer的疑问.
      

  5.   

    楼上说得对,java里是不存在真正的地址传递的,所以很难实现两参数交换之类的操作
      

  6.   

    a ------ A
    b ------ B
    调用了 operator 之后
    //x是a的引用,y是b的引用
    x.append(y); //实际上是操作a
    y=x;         //这里就是把y的引用改变了,不再指向b了。变为引用x了,也就是引用a了,
                 //如果现在 y.append(">_<"); 其实也是在改变a,现在a的值为AB>_<
      

  7.   


    import java.io.*;
    public class fileTest{
            public static void main(String[] args) throws java.io.IOException
            {
              RandomAccessFile file1 = new RandomAccessFile("c:\\1.txt", "r");
              RandomAccessFile file2 = new RandomAccessFile("c:\\2.txt", "rw");
              String strLine = "";
              while ( (strLine = file1.readLine())!=null) {
                int ilength = strLine.length();
                int[] iResult = new int[ilength];
                for (int i = 0; i < ilength; i++) {
                  iResult[i] = (int) strLine.charAt(i);
                 }
                java.util.Arrays.sort(iResult);
               for (int j = 0; j < ilength; j++) {
                 file2.writeChar((char)iResult[j]);
               }
        file2.writeUTF("\r\n");
              }
            }
    }