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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 烟海 于 2014-8-9 22:57 编辑


昨天一个题目的升级版,昨晚一直没想明白,拿出来探讨下,算是互相进步吧 。。
我今晚问了下老师,最终才算搞明白,个人觉得这题还是很复杂的,就来出来,大家探讨学习下吧 。。。
代码我直接贴出来。。。然后我整理出来的解释,我也发出来,但是解释,我会隐藏,希望大家先不要看答案,自己判断出来,看看怎么判断的答案,和正确的答案有无出入?互相探讨学习,提高吧 。

代码一:
  1. package cn.itcast.collection;

  2. public class Demo3 {
  3.         public static void main(String[] args) {
  4.                 StringBuffer s1 = new StringBuffer("hello");
  5.                 StringBuffer s2 = new StringBuffer("java");
  6.                 show(s1,s2);
  7.                 System.out.println("=================");

  8.                 System.out.println(s1);
  9.                 System.out.println(s2);        
  10.         }
  11.         public static void show(StringBuffer s1 ,StringBuffer s2)
  12.         {
  13.         
  14.                 s1.append(s2);
  15.                 System.out.println("S1---"+s1);
  16.                
  17.                 s2 = s1;
  18.                 System.out.println("S2---"+s2);

  19.                 s2.append(s1);
  20.                 System.out.println("S2---"+s2);
  21.                 System.out.println("S1---"+s1);
  22.                
  23.         }

  24. }
复制代码

代码二:
  1. package cn.itcast.collection;

  2. public class Demo3 {
  3.         public static void main(String[] args) {
  4.                 StringBuffer s1 = new StringBuffer("hello");
  5.                 StringBuffer s2 = new StringBuffer("java");
  6.                 show(s1,s2);
  7.                 System.out.println("=================");

  8.                 System.out.println(s1);
  9.                 System.out.println(s2);        
  10.         }
  11.         public static void show(StringBuffer s1 ,StringBuffer s2)
  12.         {
  13.         
  14.                 s1.append(s2);
  15.                 System.out.println("S1---"+s1);
  16.                
  17.                 s1 = s2;
  18.                 System.out.println("S2---"+s2);

  19.                 s2.append(s1);
  20.                 System.out.println("S2---"+s2);
  21.                 System.out.println("S1---"+s1);
  22.                
  23.         }

  24. }
复制代码



下面是隐藏的答案部门,求没做出来前别看答案:


游客,如果您要查看本帖隐藏内容请回复

点评

来学习拉,  发表于 2014-8-10 10:10

评分

参与人数 1黑马币 +5 收起 理由
fantacyleo + 5 赞一个!

查看全部评分

95 个回复

正序浏览
回复 使用道具 举报
代码一重点在于show()方法中的s2=s1,就是说s2的对象其实已经指向了s1,所以show方法中的最后操作的对象都是s1对象的值,main主题方法中的s2还是原来的对象。
回复 使用道具 举报
本帖最后由 heshaosheng 于 2016-1-5 16:04 编辑

对象引用传递
回复 使用道具 举报
形参传递有点迷糊
回复 使用道具 举报
来学习拉
回复 使用道具 举报
学习学习!!!!
回复 使用道具 举报
呃?没看出什么特别的地方
回复 使用道具 举报
看一下答案
回复 使用道具 举报
烟海 发表于 2014-8-12 21:34
因为是void类型。。。没有return值。。所以show方法里面的。。在值上面。。和外面没有关系。。。 ...

你的代码不也没有返回值么。。这又跟返回值有啥关系、

崩溃 听不懂你的解释 我还是回去好好看书了。。。

回复 使用道具 举报
kakasa 发表于 2014-8-11 22:37
好吧,算了还是不懂。。。

x=y 就是直接赋值了把?结果是22 12 ,为什么?

因为是void类型。。。没有return值。。所以show方法里面的。。在值上面。。和外面没有关系。。。
回复 使用道具 举报
如果这里不用字符串缓冲区,用字符串结果就不一样了吧。
回复 使用道具 举报
太好了  学习下
回复 使用道具 举报
烟海 发表于 2014-8-11 21:49
跟StringBuffer 和append都有关系的。。。。
仔细看看吧 。。。

好吧,算了还是不懂。。。

x=y 就是直接赋值了把?结果是22 12 ,为什么?

  1. public static void main(String[] args)
  2.                 {
  3.                         int a=1;
  4.                         int b=2;
  5.                         show(a,b);
  6.                         System.out.println(a);
  7.                         System.out.println(b);
  8.                 }
  9.                 public static void show(int x,int y)
  10.                 {
  11.                         x=y;
  12.                         System.out.println(x);
  13.                         System.out.println(y);

  14.                 }
复制代码

回复 使用道具 举报
看答案,呵呵
回复 使用道具 举报
kakasa 发表于 2014-8-11 19:59
好像有点明白了,其实主要原因还是因为单独封装了show方法的原因吧,因为show方法会在栈内存另外生成Stri ...

跟StringBuffer 和append都有关系的。。。。
仔细看看吧 。。。
回复 使用道具 举报
学习了,加深下这块的理解。
回复 使用道具 举报
:o 有点儿意思
回复 使用道具 举报
这括号咋都乱了。。
回复 使用道具 举报
烟海 发表于 2014-8-11 15:49
因为是StringBuffer,在常量池中。。。。把s1的值赋给s2, 而且String类型的值,一旦被初始化,就不能被 ...

好像有点明白了,其实主要原因还是因为单独封装了show方法的原因吧,因为show方法会在栈内存另外生成StringBuffer s1和StringBuffer s2(地址值和main一样的?),并且执行到s2=s1的时候只是show方法里的s2的地址值指向了s1,主函数里的s2指向还是没变。
如果把show主体拖出来到主函数上面去,结果s1和s2都是hellojavahellojava。

还有代码里的容器添加动作是次要的,甚至跟StringBuffer也没什么关系吧?可以简化代码如下,并且不影响楼主要表达的问题:
  1. public class Test
  2.         {
  3. public static void main(String[] args)
  4.                         {
  5.                 StringBuffer s1 = new StringBuffer("hello");
  6.                 StringBuffer s2 = new StringBuffer("java");
  7.                
  8.                                 show(s1,s2);
  9.                 System.out.println("=================");
  10.                
  11.                                 System.out.println(s1);
  12.                 System.out.println(s2);        
  13.                         }
  14.         public static void show(StringBuffer s1 ,StringBuffer s2)
  15.                         {                       
  16.                               
  17.                 s2 = s1;
  18.                        
  19.                 System.out.println("S2---"+s2);
  20.                 System.out.println("S1---"+s1);
  21.                
  22.                         }
  23.         }
复制代码





回复 使用道具 举报
12345下一页
您需要登录后才可以回帖 登录 | 加入黑马