黑马程序员技术交流社区

标题: 昨天一个题目的升级版,昨晚一直没想明白,拿出来探讨下 [打印本页]

作者: 烟海    时间: 2014-8-9 22:56
标题: 昨天一个题目的升级版,昨晚一直没想明白,拿出来探讨下
本帖最后由 烟海 于 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. }
复制代码



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




作者: fxwb2005    时间: 2014-8-9 23:06
{:3_51:}我要看答案!
作者: Bule丶    时间: 2014-8-9 23:14
前面的我知道了,但是不知道为什么执行main方法里最后两个输出就不知道是为啥了,因为是引用类型,用了new,在内存中开辟了空间,那么s1=s2的时候,这两个对象指向的是一块内存空间了,也就是说改变另一个的值都会变,因为两个对象指向的一个内存的值,但是不知道回到main之后的两个输出为什么是不一样的
作者: Bule丶    时间: 2014-8-9 23:16
原来如此,竟然是s1在内存的值因为两个对象指向了同一块空间,而mian方法里被断掉了,竟然是这样
作者: 1345523981    时间: 2014-8-9 23:23
不懂,还是去看答案吧
作者: cheye0207    时间: 2014-8-9 23:23
看看答案
作者: 烟海    时间: 2014-8-9 23:29


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



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




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


作者: jiangweibin2573    时间: 2014-8-9 23:35
这个题只要明白形参和引用数据类型的特点  就百毒不侵了。。。
作者: 回头浪子心    时间: 2014-8-9 23:38
呵呵。。。其实很简单的好不
作者: 烟海    时间: 2014-8-9 23:46
回头浪子心 发表于 2014-8-9 23:38
呵呵。。。其实很简单的好不

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

是的。。所以我想了N久。。。都没想明白。。特地去问了老师。。。
绕了好久,才搞明白。。。这题是值得好好想想吧 ??
作者: Bule丶    时间: 2014-8-9 23:56
烟海 发表于 2014-8-9 23:47
是的。。所以我想了N久。。。都没想明白。。特地去问了老师。。。
绕了好久,才搞明白。。。这题是值得好 ...

嗯嗯是啊
作者: fantacyleo    时间: 2014-8-9 23:56
烟海 发表于 2014-8-9 23:47
是的。。所以我想了N久。。。都没想明白。。特地去问了老师。。。
绕了好久,才搞明白。。。这题是值得好 ...

遇到这种题,牢记Java的参数是值传递,然后画内存图
作者: 乐此不疲    时间: 2014-8-9 23:58
瞅瞅答案  
作者: 烟海    时间: 2014-8-9 23:58
fantacyleo 发表于 2014-8-9 23:56
遇到这种题,牢记Java的参数是值传递,然后画内存图

内存图。。对这题确实有用。。。
但是也要清楚的了解到StringBuffer ,以及他的赋值,,等等这些的处理机制。。。
而且要能过清楚的联系上。。。才能解决这题。。。
这题是昨天一个哥们问的题目。。在测试期间。我增加了东西,就多出问题了。。。
作者: inception    时间: 2014-8-10 00:03
看看答案。。
作者: icris    时间: 2014-8-10 00:06
  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:07
本帖最后由 彬锐 于 2014-8-10 00:12 编辑

有点晕晕乎乎的。。总是理所当然的纯粹只看里面的值了 然后进行互相添加
哎,看了这个感觉自己基础还是不行
内存 堆栈这些只是一知半解   得继续加强了 努力。   这题就是内存的指向

作者: 790324255a    时间: 2014-8-10 00:09
本帖最后由 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是之前的地址值 故其值内存地址的值更改有效
作者: fantacyleo    时间: 2014-8-10 00:25
嗯,分析是对的。有两处小细节:
1. StringBuffer是在常量池中,这个说法有依据吗?
2. “s2=s1 这一步,不能看作赋值” 这一步肯定是赋值,s2的值是地址,经过这步之后旧值被新值所取代,换了一个地址值,也就是换了指向。
作者: 陈云阳    时间: 2014-8-10 00:44
学习了 ,
作者: 唕    时间: 2014-8-10 00:59
看看和自己想地
作者: 烟海    时间: 2014-8-10 01:05
fantacyleo 发表于 2014-8-10 00:25
嗯,分析是对的。有两处小细节:
1. StringBuffer是在常量池中,这个说法有依据吗?
2. “s2=s1 这一步,不 ...

1.StringBuffer中的值,就是一个个char类型的字符,确实都是在常量池中的,StringBuffer是拼起来的字符,很多字符拼一起,组成了字符串。。。
2.这儿可能我之前的表达不是很严谨,正确的表达,应该是“不能仅仅看作赋值”。。。因为通俗的赋值就是修改了s2中的值,而这里s2本身的值并没有改变,只是修改了指向。。指向了s1的地址。。然后s2 s1指向了同一个地址,是表达不严谨,但是大概意思,也都能理解了吧 ?
作者: 烟海    时间: 2014-8-10 01:07
icris 发表于 2014-8-10 00:06

理解基本对了一半。。。很不错了。。。。
仔细看看,还有一些细节的。。。
作者: 烟海    时间: 2014-8-10 01:08
彬锐 发表于 2014-8-10 00:07
有点晕晕乎乎的。。总是理所当然的纯粹只看里面的值了 然后进行互相添加
哎,看了这个感觉自己基础还是不行 ...

多看看吧 。。这一题我开始也是一样不会。。。
怎么都分析不出来。。

后来还是拿着问的老师。。。
然后想着自己整理下。。。。就整理了这么多。。

后来就想着拿出来和小伙伴们分享一下这题了。。。。{:3_59:}
作者: 新语新空    时间: 2014-8-10 01:15
看下答案。。。感觉有点意思
作者: M单色调    时间: 2014-8-10 01:27
不懂,看答案了!
作者: fantacyleo    时间: 2014-8-10 01:38
烟海 发表于 2014-8-10 01:05
1.StringBuffer中的值,就是一个个char类型的字符,确实都是在常量池中的,StringBuffer是拼起来的字符, ...

1. StringBuffer内部有一个字符数组,而数组存在于堆内存中的。所以
  1. String s1 = "abc";
  2.                 String s2 = "abc";
  3.                 System.out.println(s1 == s2); // true
  4.                 StringBuffer buffer1 = new StringBuffer("cde");
  5.                 StringBuffer buffer2 = new StringBuffer("cde");
  6.                 System.out.println(buffer2 == buffer1); // false
复制代码


2. 你的意思我是明白,只是澄清一下概念。s2 = s1确实修改了s2的值。因为s2的值是地址,当然因为java取消了指针操作,你无法直接打印出这个地址值,但Java语言规范还是说了:The reference values (often just references) are pointers to these objects,明确了引用变量的值就是指针,也就是地址
作者: icris    时间: 2014-8-10 03:47
烟海 发表于 2014-8-10 01:07
理解基本对了一半。。。很不错了。。。。
仔细看看,还有一些细节的。。。 ...

我觉得你绕进去了,不用想那么多,运行到哪值是什么都清清楚楚的,为什么要去分析StringBuffer?难道下一次换成StringBuilder就不一样了?难道再下次用反射改字符串就不一样了?
  1. class T4 {
  2.         public static void main(String[] args) {
  3.                 String s1 = new String("hello");
  4.                 String s2 = new String("java");
  5.                 show(s1, s2);
  6.                 System.out.println("=================");
  7.                 System.out.println(s1);
  8.                 System.out.println(s2);
  9.         }

  10.         public static void show(String s1, String s2) {
  11.                 try {
  12.                         append(s1, s2);
  13.                         System.out.println("S1---" + s1);
  14.                         s1 = s2;
  15.                         System.out.println("S2---" + s2);
  16.                         append(s2, s1);
  17.                         System.out.println("S2---" + s2);
  18.                         System.out.println("S1---" + s1);
  19.                 } catch (Exception e) {
  20.                         // TODO Auto-generated catch block
  21.                         e.printStackTrace();
  22.                 }
  23.         }

  24.         private static void append(String s1, String s2)
  25.                         throws NoSuchFieldException, IllegalAccessException {
  26.                 Field value = String.class.getDeclaredField("value");
  27.                 value.setAccessible(true);
  28.                 char[] v1 = (char[]) value.get(s1);
  29.                 char[] v2 = (char[]) value.get(s2);
  30.                 char[] v12 = new char[v1.length + v2.length];
  31.                 System.arraycopy(v1, 0, v12, 0, v1.length);
  32.                 System.arraycopy(v2, 0, v12, v1.length, v2.length);
  33.                 value.set(s1, v12);
  34.         }
  35. }
复制代码

有什么变了吗?
所以有时候不要去看那些细节,那些跟问题没有多少关系,不要自己吓唬自己
作者: 戒风    时间: 2014-8-10 06:12
有点晕,基础不行呀
作者: 冷风    时间: 2014-8-10 08:42
只看了代码的时候还觉得看得懂,但是看了下面的:dizzy:晕了
作者: justin1258    时间: 2014-8-10 09:47
看看答案。
作者: kangkai    时间: 2014-8-10 10:00
看看答案~~~~~~~~~~~
作者: 张周飞    时间: 2014-8-10 10:08
骚年:我来学习来了.........
作者: wyf20106    时间: 2014-8-10 10:11
来学习拉
作者: 晓俞飞、孰能归    时间: 2014-8-10 10:26
赞一个 很不多
作者: laibin2    时间: 2014-8-10 11:46
ddddddddddddddddddddddd
作者: 柀堓椛開    时间: 2014-8-10 12:17
搞迷糊了   最后还是弄明白了但是不知道怎么说
作者: 陶圣虎    时间: 2014-8-10 13:54
看下答案 是不是一样
作者: jwx555    时间: 2014-8-10 14:50
这是考验基础啊
作者: 地狱天堂    时间: 2014-8-10 15:20
主函数中的打印结果跟自己想的不一致。
作者: cs8630323    时间: 2014-8-10 15:37
汗,就帖两段代码什么意思??
作者: 冒牌高手    时间: 2014-8-10 16:22
内存引用的问题吧
作者: 刘沙    时间: 2014-8-10 18:49
想看看答案 回复个先
作者: 烟海    时间: 2014-8-10 23:27
fantacyleo 发表于 2014-8-10 01:38
1. StringBuffer内部有一个字符数组,而数组存在于堆内存中的。所以

是的。。。所以说之前说的不够严谨。。。。
作者: 烟海    时间: 2014-8-10 23:30
张周飞 发表于 2014-8-10 10:08
骚年:我来学习来了.........

哥们入学了吗?

我传智快结束了。。目前不知道能不能赶得上这一次43期呢。。。
作者: 左脑想你    时间: 2014-8-11 08:14
看看答案跟自己想的一样不
作者: nxp1986    时间: 2014-8-11 08:21
本帖最后由 nxp1986 于 2014-8-11 08:35 编辑

我也看看答案,其实第一道还是比较容易理解的,就是堆内存中相互赋值然后,s2=s1就是像楼上说的那么多一样,所以输出s2肯定是 hellojava。
因为已经赋值了,所以s2.append(s1)其实就是在赋值完以后再添加s1.所以结果就是输出两次hellojava.

第二道题确实有点晕,s1=s2的时候,画个图应该比较容易理解,s1.append(s2)只是单纯的在s1里面添加s2的元素,没有从新指向。
而当s1=s2的时候s1直接指向了s2,所以输出的是s2的内容。因为s1已经指向了s2,也就是说内存中的地址是一样的,所以当s2.append(s1)的时候,必须输出的是javajava了。

作者: 侯岩卿    时间: 2014-8-11 08:39
看看答案和我想的一样不一样
作者: 张周飞    时间: 2014-8-11 09:02
烟海 发表于 2014-8-10 23:30
哥们入学了吗?

我传智快结束了。。目前不知道能不能赶得上这一次43期呢。。。 ...

传智怎么样??怎么不上黑马视频辅导班呢?
作者: 烟海    时间: 2014-8-11 12:35
张周飞 发表于 2014-8-11 09:02
传智怎么样??怎么不上黑马视频辅导班呢?

当时想上7.5号的视频培训班的。。结果我报名的时候已经满了。。。

然后没办法,想想自学的进度太慢,就来传智上基础班了。。7.15开课的。。8.24结课。。。所以不知道赶不敢的及8.30这一期的安卓班呢。。。

而且传智基础班学的东西很少。好多都没学。。
作者: 烟海    时间: 2014-8-11 12:38
nxp1986 发表于 2014-8-11 08:21
我也看看答案,其实第一道还是比较容易理解的,就是堆内存中相互赋值然后,s2=s1就是像楼上说的那么多一样 ...

第一题的s1输出的是java ..不是两次hellojava 。。。。亲。。仔细看看题目吧 。。。
作者: kakasa    时间: 2014-8-11 13:53
看下答案
作者: ﹑淼    时间: 2014-8-11 14:04
s1---hellojava
s2---hellojava
s2---javahellojava
s1---javahellojava
=============
hello
java
作者: kakasa    时间: 2014-8-11 14:12
这时候修改后的s2和传进来的s2已经失去了联系

为什么失去联系?  这个求解释一下。
作者: ﹑淼    时间: 2014-8-11 14:54
希望没画错:)

StringBufferDemo3内存图.png (105.4 KB, 下载次数: 16)

根据楼主的 答案做的内存图

根据楼主的 答案做的内存图

作者: 烟海    时间: 2014-8-11 15:47
﹑淼 发表于 2014-8-11 14:54
希望没画错

基本没问题。。画的很好。。。
这个内存图。。我都不一定画的出来。。。。
作者: 烟海    时间: 2014-8-11 15:49
kakasa 发表于 2014-8-11 14:12
这时候修改后的s2和传进来的s2已经失去了联系

为什么失去联系?  这个求解释一下。 ...

因为是StringBuffer,在常量池中。。。。把s1的值赋给s2, 而且String类型的值,一旦被初始化,就不能被改变,所以s2的值不会改变。。。。
这时候只会把s2也指向s1 修改了地址的指向地址。。。
所以那时候s1 s2都指向同一个常量池。。。。
这时候和传入进来的s2已经断开了联系。。。
作者: 张周飞    时间: 2014-8-11 16:00
烟海 发表于 2014-8-11 12:35
当时想上7.5号的视频培训班的。。结果我报名的时候已经满了。。。

然后没办法,想想自学的进度太慢,就 ...

看你这架势  一定能上!!!每天去教堂给你祈祷  愿上帝与你同在 愿你能上....
作者: 烟海    时间: 2014-8-11 16:28
张周飞 发表于 2014-8-11 16:00
看你这架势  一定能上!!!每天去教堂给你祈祷  愿上帝与你同在 愿你能上.... ...

因为24号才结课。。而高新什么都还没看。。。。最近一边要赶进度。。一边还要看这边上课的内容。。。

所以有点耽误时间。。。。不过这样前面的东西。掌握的都还挺不错。。。
作者: 烟海    时间: 2014-8-11 16:38
beyondjia 发表于 2014-8-11 16:09
看完之后觉得。。。我还是要继续学习。。。

好好学。。一起努力吧 。。。。。
作者: 想做开发    时间: 2014-8-11 17:02
我表示不是很懂
作者: 齐海宏    时间: 2014-8-11 17:07
第一个
S1-------hellojava
S2-------hellojava
S2-------hellojavahellojava
S1-------hellojavahellojava
=================
hellojavahellojava
java

第二个
S1---------hellojava
S2---------java
S2---------java
S1---------java
================
hellojava
helloJava

他们传过去的全是引用,所以会改变值,而且引用在改变

作者: 烟海    时间: 2014-8-11 17:09
想做开发 发表于 2014-8-11 17:02
我表示不是很懂

不是很懂。。就仔细看看。。。
作者: 齐海宏    时间: 2014-8-11 17:10
第一个
S1-------hellojava
S2-------hellojava
S2-------hellojavahellojava
S1-------hellojavahellojava
=================
hellojavahellojava
java

第二个
S1---------hellojava
S2---------java
S2---------javajava
S1---------javajava
================
hellojava
javaJava

他们传过去的全是引用,所以会改变值,而且引用在改变
作者: 想做开发    时间: 2014-8-11 17:25
烟海 发表于 2014-8-11 17:09
不是很懂。。就仔细看看。。。

恩恩        
作者: huanglyhf    时间: 2014-8-11 17:38
为啥两个都变了啊
作者: 张涛的狂怒    时间: 2014-8-11 17:40
看看答案
作者: J.twt    时间: 2014-8-11 18:15
怎么感觉简单?
作者: 幽梦惊魂    时间: 2014-8-11 18:50
:victory::victory:
作者: 怀念黑海岸    时间: 2014-8-11 18:59
本帖最后由 怀念黑海岸 于 2014-8-11 19:03 编辑

额,我想知道问题是什么????是求打印结果吗??
作者: 烟海    时间: 2014-8-11 19:04
怀念黑海岸 发表于 2014-8-11 18:59
额,我想知道问题是什么????是求打印结果吗??

是的。。看看打印结果和你预想的是不是一样??
作者: 怀念黑海岸    时间: 2014-8-11 19:12
烟海 发表于 2014-8-11 19:04
是的。。看看打印结果和你预想的是不是一样??

恩,和哦我想的结果是一样的。。呵呵,这儿我特别深究过的的,所以不是特别难。
作者: 烟海    时间: 2014-8-11 19:48
怀念黑海岸 发表于 2014-8-11 19:12
恩,和哦我想的结果是一样的。。呵呵,这儿我特别深究过的的,所以不是特别难。 ...

哦。。那挺厉害的了。。
作者: kakasa    时间: 2014-8-11 19:59
烟海 发表于 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.         }
复制代码






作者: kakasa    时间: 2014-8-11 20:01
这括号咋都乱了。。
作者: as_heima    时间: 2014-8-11 20:18
:o 有点儿意思
作者: dreamseekerkun    时间: 2014-8-11 21:09
学习了,加深下这块的理解。
作者: 烟海    时间: 2014-8-11 21:49
kakasa 发表于 2014-8-11 19:59
好像有点明白了,其实主要原因还是因为单独封装了show方法的原因吧,因为show方法会在栈内存另外生成Stri ...

跟StringBuffer 和append都有关系的。。。。
仔细看看吧 。。。
作者: 阿磊    时间: 2014-8-11 21:59
看答案,呵呵
作者: kakasa    时间: 2014-8-11 22:37
烟海 发表于 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.                 }
复制代码


作者: babyxuhuan    时间: 2014-8-11 23:12
太好了  学习下
作者: 复仇者联盟    时间: 2014-8-11 23:31
如果这里不用字符串缓冲区,用字符串结果就不一样了吧。
作者: 烟海    时间: 2014-8-12 21:34
kakasa 发表于 2014-8-11 22:37
好吧,算了还是不懂。。。

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

因为是void类型。。。没有return值。。所以show方法里面的。。在值上面。。和外面没有关系。。。
作者: kakasa    时间: 2014-8-12 23:25
烟海 发表于 2014-8-12 21:34
因为是void类型。。。没有return值。。所以show方法里面的。。在值上面。。和外面没有关系。。。 ...

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

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


作者: 思如涌泉    时间: 2014-9-15 14:47
看一下答案
作者: JounQin    时间: 2014-9-23 17:59
呃?没看出什么特别的地方
作者: lovejjfg    时间: 2015-2-27 12:54
学习学习!!!!
作者: darksied    时间: 2015-3-3 20:51
来学习拉
作者: 1047690978    时间: 2015-9-21 10:20
形参传递有点迷糊
作者: heshaosheng    时间: 2016-1-5 15:46
本帖最后由 heshaosheng 于 2016-1-5 16:04 编辑

对象引用传递
作者: heshaosheng    时间: 2016-1-5 16:02
代码一重点在于show()方法中的s2=s1,就是说s2的对象其实已经指向了s1,所以show方法中的最后操作的对象都是s1对象的值,main主题方法中的s2还是原来的对象。
作者: 子live    时间: 2017-5-6 00:49
我要看看运行结果





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