黑马程序员技术交流社区

标题: StringBuffer疑问。 [打印本页]

作者: loading……99.9    时间: 2013-10-17 18:04
标题: StringBuffer疑问。
本帖最后由 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呢?求大神指教。

作者: 卜弦    时间: 2013-10-17 18:27
本帖最后由 卜弦 于 2013-10-17 19:15 编辑

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

作者: 阿里策    时间: 2013-10-17 18:33
本帖最后由 阿里策 于 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。
作者: loading……99.9    时间: 2013-10-17 18:45
卜弦 发表于 2013-10-17 18:27
============好像搞错了

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

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

路过,看看,解答很给力呀!
作者: 卜弦    时间: 2013-10-17 19:13
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;  //在局部变量执行赋值语句是没有意义的,因为它们的内存都是在堆中新开辟的。
所以 你如果把程序改成我这样就明白了。
*/





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