黑马程序员技术交流社区

标题: list容器习题疑问 [打印本页]

作者: 小黑马    时间: 2012-9-13 13:00
标题: list容器习题疑问
本帖最后由 马小龙 于 2012-9-13 21:26 编辑

package com.itheima;

import java.util.ArrayList;

class Data {
        int        val;
        int        getVal() {
                return val;
        }
        void        setVal(int val) {
                this.val = val;
        }
}
public class ListTest {

  public static void main(String argv[]) {
          Data data = new Data();
          ArrayList list = new ArrayList();

          for (int i=100; i<103; i++) {
            data.setVal(i);//分别往ArrayList装入3个Data对象,这三个Data对象的val分别是100,101,102
            list.add(data);
          }
        int j = 0;
        while (j < list.size()) {//
          Data tmp = (Data )list.get(j); //循环获得这三个数据,并强转成Data对象
          System.out.println("list(" + j + ") = " + tmp.getVal());
          j++;
        }
  }
}
/*
这个问题好奇怪,自己按照思路得出的答案是
list(0)=100 list(1)=101  list(2)=102
为什么编译运行后是
list(2)=102 list(2)=102 list(2)=102
*/
请大神详细解答一下
作者: 黑马张旭明    时间: 2012-9-13 13:21
public class ListTest {

  public static void main(String argv[]) {
          Data data = new Data();             //只new了一个对象
          ArrayList list = new ArrayList();

          for (int i=100; i<103; i++) {
            data.setVal(i);//分别往ArrayList装入3个Data对象,这三个Data对象的val分别是100,101,102
            list.add(data);
          }
        int j = 0;
        while (j < list.size()) {//
          Data tmp = (Data )list.get(j); //循环获得这三个数据,并强转成Data对象
          System.out.println("list(" + j + ") = " + tmp.getVal());
          j++;
        }
  }
}

问题出在Data data = new Data(); 和data.setVal(i);这两句。
     首先,list里保存的是引用,即指向data这个对象的引用。
     第一次data.setVal(i);
     data对象中的Val值变成100.
     listadd(data);
     将指向data的引用存入list集合中。
    第二次data.setVal(i);
     data对象中的Val值变成101.
     listadd(data);
     将指向data的引用存入list集合中。
    第三次data.setVal(i);
     data对象中的Val值变成102.
     listadd(data);
     将指向data的引用存入list集合中。
   
这时list集合中就有了三个引用,都指向data,而随着每次data.setVal(i); data中的Val值就改变一次,最后是102,
这三个引用都是一样的,都指向了内存中同一个对象data,而 data中的数值最后是102,所以三个getVal();取
出的都是102.  

作者: 李菁    时间: 2012-9-13 13:41
  Data data = new Data();只new了一个对象,那就在堆内存中分配了一个名为data的空间,
每次调用setVal的方法改变一次data的值,但是只有一个引用,所以最后data的值是102




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