public class TestStringBuffer {   
    public static void main(String[] args) {          
        StringBuffer a=new StringBuffer("A");   
        StringBuffer b=new StringBuffer("B");   
        method(a,b);   
        System.out.println(a+","+b);   
    }   
    public static void method(StringBuffer x,StringBuffer y){          
        x.append(y);    
        y=x;   
    }   
}   谁解释一下答案为什么不是A,B或AB,AB?

解决方案 »

  1.   

    应该是
    AB,B
    原因:a,b,x,y只是对象的reference(句柄)
    a指向一个对象,b指向另外一个
    形参x=a后x操作的就是a指向的对象
    所以x.append操作的就是实际a指向的对象
    但是y=x只是相当于把y现在也是指向a指向的对象而已
    同时,它已经不再指向b指的对象
    但是它什么都没有做,所以b未变
      

  2.   

     
    兄弟,我把你的程序做下修改,你自己揣摩下吧public class TestStringBuffer {   
        public static void main(String[] args) {          
            StringBuffer a=new StringBuffer("A");   
            StringBuffer b=new StringBuffer("B");   
            method(a,b);   
            System.out.println(a+","+b);  //打印出来 AB,B 
        }   
        public static void method(StringBuffer x,StringBuffer y){          
            x.append(y);    
            y=x; 
            System.out.println(x+","+y);  //打印出来是 AB,AB
        }   
    }   原因是 a,b,x,y 都是引用类型,换言之它们都是变量,它们的内容是它们指向对象的地址,在子函数中
    y=x
    你仅仅对y的内容做了改动,但是b的内容并没有改动,所以 会出现这样的结果。希望我讲清楚了,欢迎讨论。
      

  3.   

    Java中参数传递只有值传递
    意思是在函数体中无法改变实参与变量的对应关系
      

  4.   

    public class TestStringBuffer {   
        public static void main(String[] args) {          
            StringBuffer a=new StringBuffer("A");   
            StringBuffer b=new StringBuffer("B");   
            method(a,b);   
            System.out.println(a+","+b);
        }   
        public static void method(StringBuffer x,StringBuffer y){          
            //x.append(y);    
            //y=x;
            
            x.append("B");
            y.append("A");
            //y = x.append("A" + "B");
        }   
    }值得揣摩
      

  5.   

    public class TestStringBuffer {   
        public static void main(String[] args) {          
            StringBuffer a=new StringBuffer("A");   
            StringBuffer b=new StringBuffer("B"); 
            StringBuffer c[];
            c=method(a,b);
            a=c[0];
            b=c[1];      
            System.out.println(a+","+b); // RESULT:AB,AB
        }   
        public static StringBuffer[] method(StringBuffer x,StringBuffer y){          
            StringBuffer[] sb=new StringBuffer[2];//sb纯粹是StringBuffer的头字母缩写,呵呵
            x.append(y);
            y=x;
            sb[0]=x;
            sb[1]=y;
            return sb;
            
        }   
    }   
      

  6.   

    a,x指向同一个StringBuffer
    b,y也指向同一个StringBuffer在method方法中 x.append(y) 改变了x所指向StringBuffer的内容,
    当然也就等于同时改变了a所指向StringBuffer的内容而y=x 只是改变了y的指向,b所指向的对象并没有改变 
      

  7.   

    java参数传递只有传值的含义是:对于基本类型则复制变量的值传递
    对于抽象类型则复制一份引用传递
      

  8.   

      public   static   void   method(StringBuffer   x,StringBuffer   y){     
    这里y传进来只是引用,你改变了引用,没有用,你只是把引用y付了一个新的引用。并没有影响到引用b。b还是指向原来的引用。但是x则不通,你调用了x引用,对原对象进行了操作,改变了x和a指向的对象的内容。你还是工力不够啊。把指针和对象没有分开!
      

  9.   

         __           __
    (1)     |A |         |B |
        ~~~~         ~~~~
          / |           / |
       a  |          b  |
          |             |
          x             y
         __           __
    (2)     |AB|         |B |
        ~~~~         ~~~~
          / |           / |
       a  |          b  |
          |             |
     x.append(y)        y    
         __           __
    (3)     |AB|         |B |
        ~~~~         ~~~~
          / | \         / 
       a  |  \       b  
          |   \          
          x    \------->y=x       
        
    (4)               a is "AB", b is "B"
      

  10.   

    to  ls
    你這樣很辛苦哦