Public class Test{
   Public static void main(String[] args ){
      StringBuffer a=new StringBuffer("A");
      StringBuffer b=new StringBuffer("B");
      Oprate(a,b);
      System.out.println(a+","+b);  
   }
   Static void Oprate (StringBuffer x, StringBuffer y){
     x.append(y);
     y=x;
   }
}
a) A,B
b) AB,B 
c) A,AB 
d) AB,AB 
为什么答案是B。。

解决方案 »

  1.   

      x.append(y); 所以为 AB
      y=x; 这个在局部方法内无效,所以操作之后,y仍是B
      

  2.   

    是B啊,因为你没有改变StringBuffer y的值,它不是引用类型
      

  3.   

    值传递和引用传递的区别,如果穿的是基本类型,调用方法后,值将改变,而传引用类型,值不变,append是内部方法,调用会改变。
      

  4.   

    先不吐槽你的大小写问题了
    你这写的,直接复制都不能用。是这样的
    首先呢
    你有一个StringBuffer a 和 一个 StringBuffer b
    然后他们被传进了方法operate
    然后他们传进去的时候呢,传了一个引用
    这是什么意思呢
    就是说
    假如 StringBuffer a 真实指向的地址是 50
    StringBuffer b 真实指向的地址是 100
    那么在传入的时候
    方法中就是另外两个
    StringBuffer x 和StringBuffer y分别指向了50 和 100
    使用append的时候
    实际的地址50后面的第一个StringBuffer被操作了,变成了"AB",也就是引用的对象已经改变了
    而y=x的时候
    只是y这个引用指向了x指向的50
    在方法完成以后
    a还是指向50
    b还是指向100
    因为这个 a b 跟 x y不是一样的东西,是四个不同的引用
    说到这个就要补充一下
    所有的对象变量名 都只是一个指向地址的引用标识,而不代表对象本身
    所以a指向的50由于append操作改变了
    但是b指向的100没有任何改变
    y=x仅仅是让y指向了50而已
      

  5.   


     class Test{
      public static void main(String[] args ){
      StringBuffer a=new StringBuffer("A");
      StringBuffer b=new StringBuffer("B");
      Oprate(a,b);
      System.out.println("方法完成之后AB"+a+","+b);
      System.out.println("方法完成之后的AB指向的对象为"+a.hashCode()+","+b.hashCode());
      }
      static void Oprate (StringBuffer x, StringBuffer y){
      x.append(y);
      y=x;
      System.out.println("方法完成之后XY"+x+","+y);
      System.out.println("方法完成之后的XY指向的对象为"+x.hashCode()+","+y.hashCode());
      }
    }楼主你运行一下我这个玩意就明白了