黑马程序员技术交流社区

标题: 向各位请教集合问题! [打印本页]

作者: Tyson    时间: 2014-11-19 17:48
标题: 向各位请教集合问题!
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,!
还请各位大神指点迷津!

作者: 哈达洋    时间: 2014-11-19 18:56
list里存放的是对象的引用,你这里,自始至终都只有一个对象,所以list中的每个元素指向的都是data这个对象,你最后data对象中的val值被赋值为了102.所以最终打印的都是102.
作者: hailong    时间: 2014-11-19 20:35
把创建对象的代码放到for循环里面就好了,每次循环创建一个对象
作者: 壹贰叁    时间: 2014-11-19 20:41
你定义的list加入了3data对象,虽然list里面存有三个对象,但list[0],list[1],list[2],里面存的都是指引向堆内存中data的内存地址,所以不管你改其中哪个的数据,另外两个也会跟着变
作者: DamonZh    时间: 2014-11-19 20:50
你这里只有一个Data类型的对象,然后你在for中对同一个对象的val属性赋了三次值,每次赋值都会覆盖前一次的。然后你将这个对象的引用存到list中三次。集合中存的是对象的引用,而不是对象本身。所以集合中的三个引用都始终都指向的是同一个对象。所以最后打印出来的是最后一次给val赋的值,也就是102咯




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