关于StringBuffer的问题。

cjhuaxin 2012-07-25 05:25:06
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啊,有点费解,希望高手帮小弟解答一些,万分感谢!
...全文
216 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
雾里岚田 2012-08-14
  • 打赏
  • 举报
回复
内存分析图太小了,看这个地址:http://img.my.csdn.net/uploads/201208/14/1344942600_7068.jpg
不好意思有点罗嗦了。
雾里岚田 2012-08-14
  • 打赏
  • 举报
回复
图片补充:
内存分析情况图如下:

doc下的运行结果如下图:
雾里岚田 2012-08-14
  • 打赏
  • 举报
回复
针对楼主的问题如下:
内存分析情况图如下(若有错请高手指点):


代码如下(如楼主差不多的):
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下的运行结果如下图:

cjhuaxin 2012-07-25
  • 打赏
  • 举报
回复
小弟终于弄明白你了,感谢大家的解答!!
zhoujiping1234 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

StringBuffer sb1 = new StringBuffer("One");
StringBuffer sb2 = new StringBuffer("Two");
上面两句创建了两个StringBuffer对象,并且让sb1和sb2分别指向这两个对象,可以理解为它们指向了对象的地址,它们只是引用变量而已。
swap里面,传入的是引用,a和b也是两个引用。一开始a和sb1都指向了……
[/Quote]

同意此观点
hllfl 2012-07-25
  • 打赏
  • 举报
回复
内存中对象没改变
wwwcomcn123 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 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”。
[/Quote]

b此时应该指向oneMore了吧
csdpz 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 2 楼 的回复:
引用 1 楼 的回复:
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)
……
[/Quote]
嗯,按照传引用来理解~可以解释的通。我理解了
书断华 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)


can't u……
[/Quote]好吧看来我的能力还很烂,表述估计也有问题。我的意思是最主要的是因为swap函数对sb1指向的那个对象做了一些操作,而没有对sb2指向的那个对象做任何操作!不知道这么说对不对、、、
zcjiehubeilove 2012-07-25
  • 打赏
  • 举报
回复
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”。
wwwcomcn123 2012-07-25
  • 打赏
  • 举报
回复
同意1楼
sb2指向内存“Two” 而b指向sb2
当b = a;
b指向a 则b为One More
但sb2还是指向内存“Two”的。

同样个人理解 仅供参考
jason_deng 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)
[/Quote]

can't understand what you mean
书断华 2012-07-25
  • 打赏
  • 举报
回复
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧