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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© loading……99.9 中级黑马   /  2013-10-17 18:04  /  1397 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 loading……99.9 于 2013-10-17 19:00 编辑
  1. public class StringBufferTest
  2. {
  3.         static void aMethod(StringBuffer sf1, StringBuffer sf2)
  4.         {
  5.                 sf1.append(sf2);
  6.                 sf2 = sf1;
  7.         }

  8.         public static void main(String[] args)
  9.         {
  10.                 StringBuffer sf1 = new StringBuffer("A");
  11.                 StringBuffer sf2 = new StringBuffer("B");
  12.                 StringBufferTest.aMethod(sf1, sf2);
  13.                 System.out.println(sf1 + ":" + sf2);
  14.         }
  15. }
复制代码
既然在函数里sf2=sf1了,那么sf1和sf2应该指向同一一个对象,那么打印出来的也应该是AB:AB,可为什么是AB:B呢?求大神指教。

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

6 个回复

倒序浏览
本帖最后由 卜弦 于 2013-10-17 19:15 编辑

这条回复不算。。。。。之前没想清楚~  请看下面的另一条回复。不好意思~~

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 解答很详细,赞一个

查看全部评分

回复 使用道具 举报 0 1
本帖最后由 阿里策 于 2013-10-17 18:49 编辑

    我验证了一下,结果是AB:B吧。
    这个跟内存有关系,从主函数说起,主函数声明两个引用变量sf1和sf2,分别指向堆内存中的两个StringBuffer对象,姑且叫做面盆一和面盆二。现在面盆一中存了个A,面盆二中存了个B。然后调用aMethod(StringBuffer sf1, StringBuffer sf2)方法,这时,又生成了两个引用变量sf1sf2,为了区分我加了颜色,这时首先做的操作是:sf1 = sf1;sf2 = sf2;作用是将面盆一和面盆二对象的地址赋给aMethod方法生产的两个引用变量,这时aMethod方法通过sf1sf2这两个引用变量对面盆一和面盆二进行了一些操作,sf1.append(sf2);使得面盆一中存了个“AB”,面盆二中没变,还是“B”。只不过 sf2 = sf1;使得sf1sf2都指向了面盆一。但是主函数中的sf1和sf2的指向是没有发生变化的:sf1还是指向面盆一,sf2还是指向面盆二,由于面盆一中变成了“AB”,面盆二中还是“B”,所以打印结果是  AB:B。
回复 使用道具 举报
卜弦 发表于 2013-10-17 18:27
============好像搞错了

什么搞错了,我运行了确实是AB:B,哦我哪里打字打错了马上改。
回复 使用道具 举报
阿里策 发表于 2013-10-17 18:33
我验证了一下,结果是AB:B吧。
    这个跟内存有关系,从主函数说起,主函数声明两个引用变量sf1和sf2 ...

打比方打得还这么形象具体,明白了,多谢啊。
回复 使用道具 举报
阿里策 发表于 2013-10-17 18:33
我验证了一下,结果是AB:B吧。
    这个跟内存有关系,从主函数说起,主函数声明两个引用变量sf1和sf2 ...

路过,看看,解答很给力呀!
回复 使用道具 举报
卜弦 中级黑马 2013-10-17 19:13:34
7#
loading……99.9 发表于 2013-10-17 18:45
什么搞错了,我运行了确实是AB:B,哦我哪里打字打错了马上改。

不是  之前是我弄错了 我仔细想了想。现在应该对了。希望对你有帮助。
  1. public class StringBufferTest
  2. {
  3.         static void aMethod(StringBuffer sf1, StringBuffer sf2)
  4.         {
  5.     sf1.append(sf2);
  6.     sf2 = sf1;
  7.       System.out.println(sf1 + ":" + sf2);//sf2指向了sf1,并不是s2.
  8.         }
  9.         public static void main(String[] args)
  10.         {
  11.                 StringBuffer s1 = new StringBuffer("A");
  12.                 StringBuffer s2 = new StringBuffer("B");
  13.                 aMethod(s1, s2);
  14.                 System.out.println(s1 + ":" + s2);
  15.         }
  16. }
复制代码
/*楼主 你是自己把自己弄乱了。这两个sf2不是同一个意思。aMethod里面的sf2和sf1是局部变量只在这个方法中有效。它是在aMethod函数加载时在堆中开辟的内存。
当你在main中调用aMethod方法后,
    sf1.append(sf2);//sf1获得了s1的引用,并在s1指向的缓冲区中添加了B。这句话改变了sf1和s1对应的缓冲区中的内容。
    sf2 = sf1;  //在局部变量执行赋值语句是没有意义的,因为它们的内存都是在堆中新开辟的。
所以 你如果把程序改成我这样就明白了。
*/
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马