public class StringBufferTest{
public static void main(String args[]){
StringBuffer sb1 = new StringBuffer("One");
StringBuffer sb2 = new StringBuffer("Two");
swap(sb1,sb2);
System.out.println("sb1:"+sb1);
System.out.println("sb2:"+sb2);
}
public static void swap(StringBuffer a,StringBuffer b){
a.append(" More");
b = a;
}
}
以上代码为什么为什么输出是sb1:One More sb2:Two啊,有点费解,希望高手帮小弟解答一些,万分感谢!

解决方案 »

  1.   

    首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)
      

  2.   


       can't understand what you mean
      

  3.   

    同意1楼
    sb2指向内存“Two” 而b指向sb2
    当b = a;
    b指向a 则b为One More
    但sb2还是指向内存“Two”的。同样个人理解 仅供参考
      

  4.   

    StringBuffer sb1 = new StringBuffer("One");
    StringBuffer sb2 = new StringBuffer("Two");
    上面两句创建了两个StringBuffer对象,并且让sb1和sb2分别指向这两个对象,可以理解为它们指向了对象的地址,它们只是引用变量而已。
    swap里面,传入的是引用,a和b也是两个引用。一开始a和sb1都指向了对象“one”,b和sb2都指向对象“two”。然后a.append(" More")改变了a指向的对象的内容,而b=a这个完全没关系啊,它只是让b也指向“one”而已,并不能真正改变“two”的内容,也对sb2没有影响。所以System.out.println("sb2:"+sb2)打印的仍然是对象“two”。
      

  5.   

    好吧看来我的能力还很烂,表述估计也有问题。我的意思是最主要的是因为swap函数对sb1指向的那个对象做了一些操作,而没有对sb2指向的那个对象做任何操作!不知道这么说对不对、、、
      

  6.   


    b此时应该指向oneMore了吧
      

  7.   

    针对楼主的问题如下:
    内存分析情况图如下(若有错请高手指点):
    代码如下(如楼主差不多的):
    public class Test{
    public static void main(String[] argv){
    StringBuffer a=new StringBuffer("one");
    StringBuffer b=new StringBuffer("two");
    Test.swap(a,b); System.out.println("Main方法中的值:\na is"+a+"\nb is"+b);


    }
    static void swap(StringBuffer a,StringBuffer b){
    a.append(" more");
    b=a;
    System.out.println("swap方法中的值:\na is"+a+"\nb is"+b);
    }
    }
    doc下的运行结果如下图:
      

  8.   

    图片补充:
    内存分析情况图如下:doc下的运行结果如下图:
      

  9.   

    内存分析图太小了,看这个地址:http://img.my.csdn.net/uploads/201208/14/1344942600_7068.jpg
    不好意思有点罗嗦了。