黑马程序员技术交流社区

标题: StringBuffer作为参数的问题 [打印本页]

作者: Hansion    时间: 2015-12-29 09:39
标题: StringBuffer作为参数的问题
  1.         public static void main(String[] args) {
  2.                 StringBuffer sb1 = new StringBuffer("Hello");
  3.                 StringBuffer sb2 = new StringBuffer("World");
  4.                 change(sb1,sb2);
  5.                 System.out.println(sb1+"----"+sb2);
  6.         }

  7.         public static void change(StringBuffer sb1,StringBuffer sb2) {
  8.                 sb1 = sb2;
  9.         }
复制代码
为什么结果是 Hello------World   而不是 World------World   ?

基本数据类型作为形式参数时,形式参数的改变不影响实际参数。

引用数据类型作为形式参数时,形式参数的改变直接影响实际参数。

求个详细的解答。

作者: 闭关修行小和尚    时间: 2015-12-29 09:39
你在读基础班还是就业班,可以语音或者电话告诉你.

你还没有理解函数的形式参数的意义.
在调用change( )方法时,实际上就是栈内存中,change( )内,重新创建了一个sb1和sb2,然后把主函数中的sb1和sb2的地址值赋给了change( )方法中的sb1 和 sb2,\

所以 ,方法中sb1=sb2;实际上只是将change()方法中的sb2的地址值赋给了change()方法中的sb1,他们都指向堆内存中的对象.

接着是重点.你认真听;

确实,stringbuffer是引用数据类型,但是方法中不管是sb1或者是sb2,他们并未对堆内存中的对象做任何修改,只是在不停的换地址值而已.


如果方法中当方法弹栈,两个变量随即消失,打印的sb1和sb2只是之前的sb1和sb2

打了这么多,楼主你仔细琢磨下吧,
作者: yy小宇哥    时间: 2015-12-29 17:14
在调用change(sb1,sb2)前测试一下吧{:2_40:}
作者: Hansion    时间: 2015-12-29 20:24
yy小宇哥 发表于 2015-12-29 17:14
在调用change(sb1,sb2)前测试一下吧

? 断点调试?
作者: 1158147908    时间: 2015-12-30 07:35
stringbuffer是引用数据类型,传的是地址值,当你调用chang函数的时候,只是把地址值付给了形式参数,将函数中地址值在当前函数中进行赋值,而主函数中两个变量所指的地址值并没有改变,所以值未变呀
作者: Del.U    时间: 2015-12-30 12:16
还没学到这里
作者: 闭关修行小和尚    时间: 2015-12-30 20:57
这么简单.
虽然是引用数据类型,但是处于主方法中,所以sb1和sb2都是局部变量,你调用change方法并未对两个地址值产生任何影响啊

如果是在一个单独的类中做成员的话,就会是world---world
作者: 从哪里来    时间: 2015-12-30 23:06
我去,25分还发帖。
作者: 从哪里来    时间: 2015-12-30 23:45
sb1,sb2作为作为实参时,分别将给自对象的地址值传递给形参。程序运行进入chang()函数,chang()函数进栈,chang()函数中,sb1,sb2都是局部变量,地址值传入后,sb2的值赋给sb1,sb1的值虽然是实参sb2的地址值,但是,当chang()执行完毕,方法弹栈,在方法运行时的变量也消失了。所以还是输出了原来sb1,sb2,对应对象的值。
作者: 雨来    时间: 2015-12-30 23:53
change(sb1,sb2);  change  is like a room , sb1 sb2  out  room    sb1 is sb1 sb2 is sb2
作者: 周亚飞    时间: 2015-12-31 01:34
我画了个内存图,你看看

无标题.jpg (137.49 KB, 下载次数: 136)

无标题.jpg

作者: s616622575    时间: 2016-1-1 12:28
表示菜鸟还没学到i这里,这是什么缓冲区吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2