日期:2014-05-20  浏览次数:20692 次

StringBuffer的疑问
public   class   Test   {
public   static   void   main(String[]   args){
StringBuffer   a   =   new   StringBuffer( "A ");
StringBuffer   b   =   new   StringBuffer( "C ");
f(a,b);
System.out.println(a);
System.out.println(b);
}
public   static   void   f(StringBuffer   a,StringBuffer   b){
a.append( "B ");
b=a;
}
}
上面这段程序的运行结果是:AB
                                                C
在函数f()中的b=a将b指向a,为什么打印结果还是 "C "



------解决方案--------------------
b=a时就创建了一个新的对象引用,所以b不是原来的b。
------解决方案--------------------
传递引用只能对对象操作,引用本身不能改变
------解决方案--------------------
但此b非彼b.是在f这个方法内部存在的b,出了{}就没用了。
如果想更改变,可以return b试试.
------解决方案--------------------

真个方法做的的引用传递 在内存中 把 a 的引用给了b 此时 a和b 指向的是同一堆内存
b 本省的引用 会背垃圾回收器 收回
遇到这种问题最好的方法就是画图----画它们在内存中的图
例如下图:

假设 a 的内存地址为:1111f
b 的内存地址为:4444f
1.没调用方法前
栈 堆
a(1111f) ----------> A
b(4444f) ----------> C
2.调用后
栈 堆
执行 a.append( "B ")
变化为:
a(1111f)----------> AB
b(4444f)----------> C

执行 b=a;
a(1111f)_______>
AB ——ab 指向同一个引用
b(1111f) ------>

C ___此时C 背制空 垃圾回收站会自动收回
所以在最终输出 b 时会输出 AB


------解决方案--------------------
楼主你看懂了么?我是没看懂楼上的都在说什么。

看来对于形参、实参的整体赋值方式的改变有一些不同...
------解决方案--------------------
String是一个强单利模式的类

LZ明显C语言没有学好
------解决方案--------------------
为了性能方面的考虑,java把 String类做为不可变的,所以String不可以改变,不管你做什么要

的操作,都无法修改原来的值!
------解决方案--------------------
我也没看到5楼那位高人在说什么````


其实就是java没有按引用传调````只有按值传递
main里你的StringBuffer类的变量a持有字符串 "A "的引用,StringBuffer类的变量b持有字符串 "C "的引用,传给方时的时候````是按值传递``因此是把b变量的值(即值 "A "的引用)传给方法f,又不是把b的引用传给方法f,你改变的是f方法里b变量的值(一个到字符串的引用),并没有改变main里的b的值```所以,如此这般```这样那样`````打印出来的就还是C咧````

这是我所理解的哈,我也还是菜鸟,还请高手多多指教哦``
------解决方案--------------------
明白了就结帖吧
------解决方案--------------------
jie fen
------解决方案--------------------
java 中简单数据类型都是直接拷贝值得 其它数据类型按引用传递 但有一点要注意的是 在方法体中允许改变 里面的值 却不允许将其指向另一个对象
这就是为什么a.append( "B ")对main中a有影响
而b=a对main中b没有影响的原因

至于 String类型是以常量形式存在常量池中 每次声明一个字符串 如果常量池中存在只是将其指向常两池中相应的地址 如果没有则在常量池中创建

也是为什么不要再循环中声明String 如果循环足够大 系统会死掉

个人观点 仅供参考
------解决方案--------------------
standalo() ( ) 信誉:100 Blog 加为好友

说的好

------解决方案--------------------