关于StringBuilder的一些问题,第一次发帖求支持,大家看看

darkshaddock 2013-03-26 07:51:42

public class Test{
public static void main(String[] args){
StringBuilder a = new StringBuilder("A");
StringBuilder b = new StringBuilder("B");
operate(a,b);
System.out.println(a+","+b);
}
static void operate(StringBuilder a,StringBuilder b){
a.append(b);
b=a;
}
}



输出结果为什么是AB,B
而不是AB,AB呢?
...全文
309 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkshaddock 2013-04-03
  • 打赏
  • 举报
回复
谢谢各位的解答。差不多弄清楚了,分不多就给前两位了!
sffx123 2013-03-29
  • 打赏
  • 举报
回复
理解方法调用的好例子
十年彩虹 2013-03-29
  • 打赏
  • 举报
回复
普通变量。append后也不会变啊。
Joogiyahala 2013-03-29
  • 打赏
  • 举报
回复
好精辟的例子,,,,学习了,,,多谢众位
Ada168855 2013-03-27
  • 打赏
  • 举报
回复
a 的地址变了,但是b的地址没有变
想做第一 2013-03-27
  • 打赏
  • 举报
回复
应该说你改变的是局部方法中的变量,但是并没有在main方法中改变变量
淡定的峰哥 2013-03-27
  • 打赏
  • 举报
回复
应该说a和a的副本指向同一个内存地址,操作a的副本跟操作a是一样的,所以a的副本的内容变了,a的内容也就跟着变了,但是将b的副本指向别的地址,并不能改变b指向的地址,所以b的值没变
chengxu2011 2013-03-27
  • 打赏
  • 举报
回复
引用 2 楼 kiritor 的回复:
引用 楼主 darkshaddock 的回复: Java code?123456789101112public class Test{ public static void main(String[] args){ StringBuilder a = new StringBuilder("A"); StringBuilder b = new StringBuilder("B"); o……
额 说的很好 +1
vincentTsang 2013-03-27
  • 打赏
  • 举报
回复
引用 4 楼 darkshaddock 的回复:
[quote=引用 2 楼 kiritor 的回复:] 引用 楼主 darkshaddock 的回复:Java code?123456789101112public class Test{ public static void main(String[] args){ StringBuilder a = new StringBuilder("A"); StringBuilder b = new StringBuilde……
是a的地址内容改变了,b的地址改变了吗?[/quote] a和a的副本指向同一个内存地址,故a的副本对该内存的操作的影响保留下来了,a去原地址找内存内容的时候能发觉该内容变化了,而将b的副本指向别的地址,并没改变b指向的地址,故b值没变
Luke2022_ 2013-03-27
  • 打赏
  • 举报
回复
这个问题的根源要弄清楚引用类型参数传递:引用类型参数传递的是该引用的一个拷贝,既不是该应用本身,更不是引用指向的对象;将整个过程把内存情况画一下就清楚了。
yongtaimen 2013-03-27
  • 打赏
  • 举报
回复
这是一个地址呼唤问题出现了错误,定义的函数参数类型是String类型,不能改变啊a, b的值,就像一个简单的swap(a,b)函数的道理形同
  • 打赏
  • 举报
回复
a,b又不是全局变量。交互的是参数。
一脸辣椒 2013-03-26
  • 打赏
  • 举报
回复
引用 3 楼 darkshaddock 的回复:
引用 1 楼 a5533616 的回复: 这个涉及到引用传递的问题! 在方法中的 a 和 b 在栈中是虚拟出来的,跟主函数中的a b 不是一回事, a.append(b) 改变了方法和主函数中的a的值. 但是 b = a 这是吧a的内存地址赋给了方法中的b 方法中的b 在出了方法后弹栈了,主函数中的b值一直就没变 那a弹栈了为什么却改变了呢?
因为a改变了堆中对象的内容,而b只是把指向改了
LCore 2013-03-26
  • 打赏
  • 举报
回复
引用 4 楼 darkshaddock 的回复:
引用 2 楼 kiritor 的回复:引用 楼主 darkshaddock 的回复:Java code?123456789101112public class Test{ public static void main(String[] args){ StringBuilder a = new StringBuilder("A"); StringBuilder b……
a的地址内容改变了,后半句不太准确 main中b的地址是没变的,变得只是他的“副本”
darkshaddock 2013-03-26
  • 打赏
  • 举报
回复
引用 2 楼 kiritor 的回复:
引用 楼主 darkshaddock 的回复:Java code?123456789101112public class Test{ public static void main(String[] args){ StringBuilder a = new StringBuilder("A"); StringBuilder b = new StringBuilde……
是a的地址内容改变了,b的地址改变了吗?
darkshaddock 2013-03-26
  • 打赏
  • 举报
回复
引用 1 楼 a5533616 的回复:
这个涉及到引用传递的问题! 在方法中的 a 和 b 在栈中是虚拟出来的,跟主函数中的a b 不是一回事, a.append(b) 改变了方法和主函数中的a的值. 但是 b = a 这是吧a的内存地址赋给了方法中的b 方法中的b 在出了方法后弹栈了,主函数中的b值一直就没变
那a弹栈了为什么却改变了呢?
LCore 2013-03-26
  • 打赏
  • 举报
回复
引用 楼主 darkshaddock 的回复:
Java code?123456789101112public class Test{ public static void main(String[] args){ StringBuilder a = new StringBuilder("A"); StringBuilder b = new StringBuilder("B"); operate(a,b);……
为什么a的值是AB? 因为虽然传递的a的引用副本(说法其实略有问题) 但是a.append(b)修改的是引用副本指向的内容,a指向的内容自然也就变了 为什么b值为B? 因为b=a;只是简单的把引用副本指向了a而已,它所指向的内存里面的内容没变! 说白了,一个是地址的改变 一个是地址内容的改变!
一脸辣椒 2013-03-26
  • 打赏
  • 举报
回复
这个涉及到引用传递的问题! 在方法中的 a 和 b 在栈中是虚拟出来的,跟主函数中的a b 不是一回事, a.append(b) 改变了方法和主函数中的a的值. 但是 b = a 这是吧a的内存地址赋给了方法中的b 方法中的b 在出了方法后弹栈了,主函数中的b值一直就没变

62,615

社区成员

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

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