黑马程序员技术交流社区

标题: 小程序问题求解 [打印本页]

作者: 光脚丫的小白兔    时间: 2013-10-8 21:47
标题: 小程序问题求解
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
求教...
作者: jìng╮煜    时间: 2013-10-8 22:01
本帖最后由 jìng╮煜 于 2013-10-8 22:06 编辑

逗号之前的.
首先 StringBuffer a = new StringBuffer("A");   a容器里面有了一个A了
然后  x.append(y);    又添加了一个B
再然后 y=x;的意思就是 y的指针指向了a的容器. 所以a的容器添加进了一个A.所以是ABA.但是y没有指向b容器,b容器自然没有添加进元素.就是这样


作者: doitforyou    时间: 2013-10-8 22:17
a,b都是引用,分别指向内存中的A、B
当你调用operate()方法时,开辟栈内存,
x,y也分别指向内存中的A、B,
x操作堆内存中的空间将A添加B,此时A所在的空间为AB,
然后将x的引用传给y,此时y也只想A所在的堆空间即AB,
y操作AB所在堆空间继续添加A,此时A所在空间内容为ABA。
operate()方法调用结束,x,y释放,但堆内存中操作的内容却保留了下来。
返回到main函数继续执行,此时a、b依然分别指向A、B所在堆内存
只是A中内容变为ABA,B中内容不变,所以打印结果为ABA,B
作者: doitforyou    时间: 2013-10-8 22:32
doitforyou 发表于 2013-10-8 22:17
a,b都是引用,分别指向内存中的A、B
当你调用operate()方法时,开辟栈内存,
x,y也分别指向内存中的A、B ...

^_^  版主好速度。。。
作者: To    时间: 2013-10-9 08:44
如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作




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