黑马程序员技术交流社区

标题: 终于搞懂了,就是转不过来 [打印本页]

作者: 人心如水    时间: 2014-7-14 10:54
标题: 终于搞懂了,就是转不过来
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
分析结果:由于list中存放的是Data类型的对象,而Data中的val会指向一地址。 list中添加的Data类中的val值也会指向这个地址,经过for循环后,val的值由100->101->102,list集合里面元素是可以重复的,由于在for外我们只创建了一个对象, 所以三次存入的都是同一对象,当最后一次val赋值为102时,该对象就指向了102,list里面三次存入的同一对象都会指向同一个地址
作者: fantacyleo    时间: 2014-7-14 11:06
容器中存放的不是对象,而是对象的引用。
作者: IT初学者    时间: 2014-7-14 11:07
这个肯定不行啊。简单点来看,就是你只new了一个对象,for做的每次都是改了VAL,然后加进去,我认为这样for以后list中只存了一个data对象。
作者: IT初学者    时间: 2014-7-14 11:56
哦,原来是这样。哪是不是这样2楼,LZ是每次在list存了相同引用,也就是最开始的data,for只是每次改变了val的值。对吗?




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