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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑马 黑马帝   /  2012-9-13 13:00  /  1200 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马小龙 于 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
*/
请大神详细解答一下

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

2 个回复

倒序浏览
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.  

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
  Data data = new Data();只new了一个对象,那就在堆内存中分配了一个名为data的空间,
每次调用setVal的方法改变一次data的值,但是只有一个引用,所以最后data的值是102
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马