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 个回复

倒序浏览
{:3_51:}我要看答案!
回复 使用道具 举报
前面的我知道了,但是不知道为什么执行main方法里最后两个输出就不知道是为啥了,因为是引用类型,用了new,在内存中开辟了空间,那么s1=s2的时候,这两个对象指向的是一块内存空间了,也就是说改变另一个的值都会变,因为两个对象指向的一个内存的值,但是不知道回到main之后的两个输出为什么是不一样的
回复 使用道具 举报
原来如此,竟然是s1在内存的值因为两个对象指向了同一块空间,而mian方法里被断掉了,竟然是这样
回复 使用道具 举报
不懂,还是去看答案吧
回复 使用道具 举报
看看答案
回复 使用道具 举报


楼下的小伙伴们,没做出来之前,还是别看答案了。。。



先自己思考一下。。。互相提高促进下吧 。。。。。。。




这一题涉及到了很多东西,还是有思考的价值的。。。。。

回复 使用道具 举报
这个题只要明白形参和引用数据类型的特点  就百毒不侵了。。。
回复 使用道具 举报
呵呵。。。其实很简单的好不
回复 使用道具 举报
回头浪子心 发表于 2014-8-9 23:38
呵呵。。。其实很简单的好不

很简单。。。??
求把这题重新解释一遍。。。。。或者看看答案和你自己认为的结果是否一致 ??
回复 使用道具 举报
Bule丶 发表于 2014-8-9 23:16
原来如此,竟然是s1在内存的值因为两个对象指向了同一块空间,而mian方法里被断掉了,竟然是这样 ...

是的。。所以我想了N久。。。都没想明白。。特地去问了老师。。。
绕了好久,才搞明白。。。这题是值得好好想想吧 ??
回复 使用道具 举报
烟海 发表于 2014-8-9 23:47
是的。。所以我想了N久。。。都没想明白。。特地去问了老师。。。
绕了好久,才搞明白。。。这题是值得好 ...

嗯嗯是啊
回复 使用道具 举报
烟海 发表于 2014-8-9 23:47
是的。。所以我想了N久。。。都没想明白。。特地去问了老师。。。
绕了好久,才搞明白。。。这题是值得好 ...

遇到这种题,牢记Java的参数是值传递,然后画内存图
回复 使用道具 举报
瞅瞅答案  
回复 使用道具 举报
fantacyleo 发表于 2014-8-9 23:56
遇到这种题,牢记Java的参数是值传递,然后画内存图

内存图。。对这题确实有用。。。
但是也要清楚的了解到StringBuffer ,以及他的赋值,,等等这些的处理机制。。。
而且要能过清楚的联系上。。。才能解决这题。。。
这题是昨天一个哥们问的题目。。在测试期间。我增加了东西,就多出问题了。。。
回复 使用道具 举报
看看答案。。
回复 使用道具 举报
icris 中级黑马 2014-8-10 00:06:47
17#
  1.         public static void show(StringBuffer s1, StringBuffer s2) {
  2.                 s1.append(s2); // s1 = "hellojava"
  3.                 System.out.println("S1---" + s1);
  4.                 s2 = s1; // s2 = s1 = "hellojava" && s2 不再是以前的 s2 了,以前的 s2 没变,返回 java
  5.                 System.out.println("S2---" + s2);
  6.                 s2.append(s1); // s1 == s2 , 等价于 s1 += s1; s1 = hellojavahellojava, s2 = hellojavahellojava
  7.                 System.out.println("S2---" + s2); // 再 && 这个 s2 不再是以前的 s2 了,以前的 s2 没变
  8.                 System.out.println("S1---" + s1);
  9.         }
复制代码
  1.         public static void show(StringBuffer s1, StringBuffer s2) {
  2.                 s1.append(s2); // s1 = hellojava
  3.                 System.out.println("S1---" + s1);
  4.                 s1 = s2; // s1 = s2 = java && s1 不再是 s1 了,s1 返回 hellojava
  5.                 System.out.println("S2---" + s2);
  6.                 s2.append(s1); // s2 += s2; s2 = s1 = javajava
  7.                 System.out.println("S2---" + s2);
  8.                 System.out.println("S1---" + s1);
  9.         }
复制代码
回复 使用道具 举报
本帖最后由 彬锐 于 2014-8-10 00:12 编辑

有点晕晕乎乎的。。总是理所当然的纯粹只看里面的值了 然后进行互相添加
哎,看了这个感觉自己基础还是不行
内存 堆栈这些只是一知半解   得继续加强了 努力。   这题就是内存的指向
回复 使用道具 举报 1 0
本帖最后由 790324255a 于 2014-8-10 00:21 编辑

第一个   s2 = s1; 也就是说s2指向了s1的堆内存地址 两个对象相同 下面的操作都是基于s1值的修改 s2内存指向被修改 与原先的的s2已无关系 main方法中的s2的内存地址指向没有更改 也就是s1内存地址里的值一直都在修改  而s2本身内存地址的值没有更改 最后只有s1修改有效
第二个  s1 = s2;也就是说s1指向了s2的堆内存地址 两个对象相同 下面的操作都是基于s2值的修改 s1内存指向被修改 与原先的的s1已无关系 main方法中的s1的内存地址指向没有更改  又因为s1.append(s2);此时s1是之前的地址值 故其值内存地址的值更改有效
回复 使用道具 举报
嗯,分析是对的。有两处小细节:
1. StringBuffer是在常量池中,这个说法有依据吗?
2. “s2=s1 这一步,不能看作赋值” 这一步肯定是赋值,s2的值是地址,经过这步之后旧值被新值所取代,换了一个地址值,也就是换了指向。
回复 使用道具 举报
12345下一页
您需要登录后才可以回帖 登录 | 加入黑马