黑马程序员技术交流社区

标题: 问题:分析一下结果 [打印本页]

作者: King_L    时间: 2014-9-22 15:35
标题: 问题:分析一下结果
本帖最后由 King_L 于 2014-9-23 08:16 编辑

分析运行结果,说明原理。(没有分析结果不得分)

        import java.util.ArrayList;

        class Data {
            int val;
        }

        public class Test {
                  public static void main(String args[]) {
                           Data data = new Data();
                           ArrayList<Data> list = new ArrayList<Data>();

                   for (int i = 100; i < 103; i++) {
                           data.val = i;
                           list.add(data);
                   }

                    for (Data d : list) {
                          System.out.println(d.val);
                   }
             }
      }

作者: King_L    时间: 2014-9-22 15:36
为什么都是102呢
作者: xplcc    时间: 2014-9-22 15:47
data是一个引用变量,它在栈中,保存的是堆中实例对象的地址。你在list中添加data,说到底是添加Data对象的地址,不管加多少个他们得知都是一样的,都是一个引用变量,指向同一个实例对象。你每次通过引用变量改变实例对象的成员变量针对的都是同一个对象,所以都是102
作者: King_L    时间: 2014-9-22 15:55
xplcc 发表于 2014-9-22 15:47
data是一个引用变量,它在栈中,保存的是堆中实例对象的地址。你在list中添加data,说到底是添加Data对象的 ...

100 101 102 是共享一个空间的么?如果是共享的话,就说明是102覆盖了101,如果是覆盖的话,List的长度为什么是3呢?应该是1才对呀
作者: xplcc    时间: 2014-9-22 16:01
list存的不是一个对象,而是这个对象的地址,你这个list中的三个data,都是指向一个对象的引用。
作者: libo1989329    时间: 2014-9-22 16:09
这个有点意思,list存的不是对象是对象的地址值,受教了
作者: King_L    时间: 2014-9-22 22:27
xplcc 发表于 2014-9-22 16:01
list存的不是一个对象,而是这个对象的地址,你这个list中的三个data,都是指向一个对象的引用。 ...

那为什么在list.add()下面打印data里面的值的顺序就是100 101 102 呢?
作者: Beka    时间: 2014-9-22 23:32
只new出来了一个对象,这个对象一直指向val变量,变得只是val的值,所以结果看最后赋的值。
作者: King_L    时间: 2014-9-23 08:15
Beka 发表于 2014-9-22 23:32
只new出来了一个对象,这个对象一直指向val变量,变得只是val的值,所以结果看最后赋的值。 ...

解释的非常棒~~~~谢谢




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