传进去前是ut,经过它之后就变成了"utsky",这时候就应该想到自己判断错误了啦,我是低手

解决方案 »

  1.   

    >> 我是这样想的,因为sb1、sb2是本地变量,那么就是按值传递,传递的是sb1、sb2的一份copy.sb1, sb2都是对象,不是值传递,是引用,
      

  2.   

    我想问的问题是:
    为什么swap方法交换不了sb1、sb2的值?
    而在方法里面可以交换?
      

  3.   

    如果方法的参数是int,char,long等简单类型,则传递的是值得拷贝。
    如果方法的参数是对象类型,传递的是引用的拷贝。private static void swap(StringBuffer s1,StringBuffer s2)
    中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。
      

  4.   

    如果方法的参数是int,char,long等简单类型,则传递的是值得拷贝。
    如果方法的参数是对象类型,传递的是引用的拷贝。private static void swap(StringBuffer s1,StringBuffer s2)
    中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。这是jackxing(Jack) 的解释,我认为是正确的。
    至于楼主问的:既然是按值传递,传递的就是本地的一份copy,那么为什么里面的append()方法又传回改变后的值了?
    因为你用的是stringbuffer,StringBuffer对象是可以修改的字符串。所以,它调用append()方法时,不用重新分配内存,也就是它直接在先前的内存空间里进行修改。所以值会变。
      

  5.   

    如果你用String 就可以看到不同的结果,可以试下。这就是StringBuffer与String 的不同。
      

  6.   

    还是没人答到点上首先,先确定一点:传引用是没错的。这也是为什么append()的时候可以更新到地址上的值的原故;
    但问题是在交换之后,返回主函数之前,值是交换的了,但返回后为什么没有交换???
    期待~~~继续关注!
      

  7.   

    ft!这样来理解吧,就这道题而言:
    假设:sb1 ->35(此数字代表内存地址)
          sb2 ->36
    调用swap()方法后,把sb1的值附给s1,把sb2的值附给s2。
    也就是说,s1->35,s2->36。但是注意此时sb1 ->35,sb2 ->36这是不变的。
    然后在swap()方法里,s1.append()来拼接一个字符串,注意上StringBuffer,所以在原内存地址里面做修改,而不重新分配内存。所以35内存存储的内容发生变化。
    然后s1,s2做交换,只是把s1,s2的指向改变,也就是引用改变,跟内存中存储的内容无关,同时,s1,s2也与sb1,sb2无关。改变后s1->36,s2->35。而sb1 ->35,sb2 ->36。
      

  8.   

    呵呵 楼上说的还是不对
    改成String结果也是一样  只不过有些稍微变化
    还是没交换过来.
      

  9.   

    你误会我的意思了,改成String 以后,输出结果肯定不一样,但是交换还是不会交换,上面说的很清楚了。StringBuffer 改成String后,swap()里的append(),当然要改成+=了,对sb1就不起作用,也就说,sb1的输出将不会有sky。前面一条输出会有的,也就是swap()方法会把这个拼接上去,因为你用+=的话,相当于new了一个字符串
    我只能说那么多了,如果还不理解,偶也没办法了.......
      

  10.   

    顶一个,楼主,flyineagle(逆风飞扬)说得非常清楚了
      

  11.   

    flyineagle(逆风飞扬)说得非常清楚了另String类型有点特殊,String的内容是存在一个叫对象池中的。
      

  12.   

    StringBuffer对象是可以修改的字符串。
    它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。
    所以会出现swep中的StringBuffer.append改变引用本来的值。导致最后的sb1为utsky