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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© King_L 中级黑马   /  2014-9-22 15:35  /  1320 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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);
                   }
             }
      }

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

8 个回复

正序浏览
King_L 中级黑马 2014-9-23 08:15:55
9#
Beka 发表于 2014-9-22 23:32
只new出来了一个对象,这个对象一直指向val变量,变得只是val的值,所以结果看最后赋的值。 ...

解释的非常棒~~~~谢谢
回复 使用道具 举报
Beka 中级黑马 2014-9-22 23:32:09
8#
只new出来了一个对象,这个对象一直指向val变量,变得只是val的值,所以结果看最后赋的值。

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
King_L 中级黑马 2014-9-22 22:27:17
7#
xplcc 发表于 2014-9-22 16:01
list存的不是一个对象,而是这个对象的地址,你这个list中的三个data,都是指向一个对象的引用。 ...

那为什么在list.add()下面打印data里面的值的顺序就是100 101 102 呢?
回复 使用道具 举报
这个有点意思,list存的不是对象是对象的地址值,受教了
回复 使用道具 举报
list存的不是一个对象,而是这个对象的地址,你这个list中的三个data,都是指向一个对象的引用。

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
xplcc 发表于 2014-9-22 15:47
data是一个引用变量,它在栈中,保存的是堆中实例对象的地址。你在list中添加data,说到底是添加Data对象的 ...

100 101 102 是共享一个空间的么?如果是共享的话,就说明是102覆盖了101,如果是覆盖的话,List的长度为什么是3呢?应该是1才对呀
回复 使用道具 举报
data是一个引用变量,它在栈中,保存的是堆中实例对象的地址。你在list中添加data,说到底是添加Data对象的地址,不管加多少个他们得知都是一样的,都是一个引用变量,指向同一个实例对象。你每次通过引用变量改变实例对象的成员变量针对的都是同一个对象,所以都是102
回复 使用道具 举报
为什么都是102呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马