黑马程序员技术交流社区

标题: 小问题, 为什么输出是这个结果 [打印本页]

作者: 一只文字    时间: 2013-8-12 18:45
标题: 小问题, 为什么输出是这个结果
public class FOO {

        /**
         * @param args
         */

        public static void main(String[] args) {
                // TODO Auto-generated method stub
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer ("B");
        operate (a,b);
        System.out.println(a + "," +b);
     
        }
    static void operate(StringBuffer x, StringBuffer y) {
        x.append(y);
        y = x;
        y.append("A");
    }
       
}

为什么输出结果是ABA,B
求教...

作者: 薛淑凯    时间: 2013-8-12 19:52
问题就在于StringBuffer不能用“=”来赋值,这样只能改变变量所指向的对象,就是把内存地址给另一个变量了,他俩指向同一个对象
作者: 小发    时间: 2013-8-12 20:03
楼上说的很对!我给你的代码测试了下,现在看运行结果应该很清楚了。
  1. public class Test3 {

  2.         public static void main(String[] args) {
  3.                 StringBuffer a = new StringBuffer("A");
  4.                 StringBuffer b = new StringBuffer("B");
  5. //                StringBuffer c = new StringBuffer("C");
  6.                 operate(a, b);
  7.                 System.out.println(a + "," + b);//这里的b还是原来的对象,所以值没有变。

  8.         }

  9.         static void operate(StringBuffer a, StringBuffer b) {
  10.                 System.out.println(a.hashCode()+".."+b.hashCode());
  11.                 a.append(b);
  12.                
  13.                 System.out.println(a.toString());
  14.                 System.out.println(b.toString());
  15.                 b = a;
  16.                 System.out.println(a.hashCode()+".."+b.hashCode());
  17.                 //这里得出的结果是把a的内存地址值赋给了b 在这个方法里以后  a,b都指向同一个对象a
  18.                 System.out.println(a.toString());
  19.                 System.out.println(b.toString());
  20.                 b.append("A");
  21.                 b.append("X");
  22.                 //所以这里得出的结果是一样的
  23.                 System.out.println(a.toString());
  24.                 System.out.println(b.toString());

  25.         }

  26. }
复制代码

作者: 清心玉质    时间: 2013-8-12 20:14
StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer ("B");
        operate (a,b);
分下下执行过程:
  x.append(y); //StringBuffer a -->"AB"
        y = x; //x的地址给了y,多个引用指向同一个对象:StringBuffer a-->"AB" StringBuffer b-->"AB"
        y.append("A");StringBuffer b-->ABA

个人分析,仅供参考。

作者: 以防万一    时间: 2013-8-13 22:26
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~


保持队形,谢谢合作




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