A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Hansion 中级黑马   /  2015-12-29 09:39  /  3618 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3黑马币
  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   ?

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

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

求个详细的解答。

最佳答案

查看完整内容

你在读基础班还是就业班,可以语音或者电话告诉你. 你还没有理解函数的形式参数的意义. 在调用change( )方法时,实际上就是栈内存中,change( )内,重新创建了一个sb1和sb2,然后把主函数中的sb1和sb2的地址值赋给了change( )方法中的sb1 和 sb2,\ 所以 ,方法中sb1=sb2;实际上只是将change()方法中的sb2的地址值赋给了change()方法中的sb1,他们都指向堆内存中的对象. 接着是重点.你认真听; 确实,stringbuffer是引用数据类型,但是方 ...

11 个回复

倒序浏览
你在读基础班还是就业班,可以语音或者电话告诉你.

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

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

接着是重点.你认真听;

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


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

打了这么多,楼主你仔细琢磨下吧,
回复 使用道具 举报
在调用change(sb1,sb2)前测试一下吧{:2_40:}
回复 使用道具 举报
yy小宇哥 发表于 2015-12-29 17:14
在调用change(sb1,sb2)前测试一下吧

? 断点调试?
回复 使用道具 举报
1158147908 来自手机 中级黑马 2015-12-30 07:35:46
报纸
stringbuffer是引用数据类型,传的是地址值,当你调用chang函数的时候,只是把地址值付给了形式参数,将函数中地址值在当前函数中进行赋值,而主函数中两个变量所指的地址值并没有改变,所以值未变呀
回复 使用道具 举报
Del.U 来自手机 中级黑马 2015-12-30 12:16:38
地板
还没学到这里
回复 使用道具 举报
这么简单.
虽然是引用数据类型,但是处于主方法中,所以sb1和sb2都是局部变量,你调用change方法并未对两个地址值产生任何影响啊

如果是在一个单独的类中做成员的话,就会是world---world
回复 使用道具 举报
我去,25分还发帖。
回复 使用道具 举报
sb1,sb2作为作为实参时,分别将给自对象的地址值传递给形参。程序运行进入chang()函数,chang()函数进栈,chang()函数中,sb1,sb2都是局部变量,地址值传入后,sb2的值赋给sb1,sb1的值虽然是实参sb2的地址值,但是,当chang()执行完毕,方法弹栈,在方法运行时的变量也消失了。所以还是输出了原来sb1,sb2,对应对象的值。
回复 使用道具 举报
雨来 高级黑马 2015-12-30 23:53:33
10#
change(sb1,sb2);  change  is like a room , sb1 sb2  out  room    sb1 is sb1 sb2 is sb2
回复 使用道具 举报
我画了个内存图,你看看

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

无标题.jpg
回复 使用道具 举报
表示菜鸟还没学到i这里,这是什么缓冲区吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马