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 加为好友
说的好
------解决方案--------------------