public class Test{
 public static void main(String[] args){
   StringBuilder a = new StringBuilder("A");
   StringBuilder b = new StringBuilder("B");
   operate(a,b);
   System.out.println(a+","+b);
 }
 static void operate(StringBuilder a,StringBuilder b){
  a.append(b);
  b=a;
 }
}输出结果为什么是AB,B
而不是AB,AB呢?

解决方案 »

  1.   

    这个涉及到引用传递的问题! 在方法中的 a 和 b 在栈中是虚拟出来的,跟主函数中的a b 不是一回事,
    a.append(b) 改变了方法和主函数中的a的值. 但是 b = a 这是吧a的内存地址赋给了方法中的b 
    方法中的b 在出了方法后弹栈了,主函数中的b值一直就没变
      

  2.   


    为什么a的值是AB?
     因为虽然传递的a的引用副本(说法其实略有问题)
    但是a.append(b)修改的是引用副本指向的内容,a指向的内容自然也就变了
    为什么b值为B?
      因为b=a;只是简单的把引用副本指向了a而已,它所指向的内存里面的内容没变!
       说白了,一个是地址的改变
        一个是地址内容的改变!
      

  3.   


    a的地址内容改变了,后半句不太准确
    main中b的地址是没变的,变得只是他的“副本”
      

  4.   

    应该说a和a的副本指向同一个内存地址,操作a的副本跟操作a是一样的,所以a的副本的内容变了,a的内容也就跟着变了,但是将b的副本指向别的地址,并不能改变b指向的地址,所以b的值没变
      

  5.   

    应该说你改变的是局部方法中的变量,但是并没有在main方法中改变变量
      

  6.   

    这是一个地址呼唤问题出现了错误,定义的函数参数类型是String类型,不能改变啊a, b的值,就像一个简单的swap(a,b)函数的道理形同
      

  7.   

    是a的地址内容改变了,b的地址改变了吗?a和a的副本指向同一个内存地址,故a的副本对该内存的操作的影响保留下来了,a去原地址找内存内容的时候能发觉该内容变化了,而将b的副本指向别的地址,并没改变b指向的地址,故b值没变
      

  8.   

    普通变量。append后也不会变啊。