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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tyson 中级黑马   /  2014-11-19 17:48  /  901 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
                   }
             }
      }

这个程序为何最后输出的是102,102,102,而不是100,101,102,!
还请各位大神指点迷津!

评分

参与人数 1黑马币 +40 收起 理由
松毛 + 40 神马都是浮云

查看全部评分

4 个回复

倒序浏览
list里存放的是对象的引用,你这里,自始至终都只有一个对象,所以list中的每个元素指向的都是data这个对象,你最后data对象中的val值被赋值为了102.所以最终打印的都是102.
回复 使用道具 举报
把创建对象的代码放到for循环里面就好了,每次循环创建一个对象
回复 使用道具 举报
你定义的list加入了3data对象,虽然list里面存有三个对象,但list[0],list[1],list[2],里面存的都是指引向堆内存中data的内存地址,所以不管你改其中哪个的数据,另外两个也会跟着变
回复 使用道具 举报
你这里只有一个Data类型的对象,然后你在for中对同一个对象的val属性赋了三次值,每次赋值都会覆盖前一次的。然后你将这个对象的引用存到list中三次。集合中存的是对象的引用,而不是对象本身。所以集合中的三个引用都始终都指向的是同一个对象。所以最后打印出来的是最后一次给val赋的值,也就是102咯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马