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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小张童鞋 于 2012-7-4 14:57 编辑
  1. //执行ListTest.main的结果是什么?请写出分析过程
  2. class Data {
  3.         int        val;
  4.         int        getVal() {
  5.                 return val;
  6.         }
  7.         void        setVal(int val) {
  8.                 this.val = val;
  9.         }
  10. }

  11. public class ListTest {

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

  15.           for (int i=100; i<103; i++) {
  16.             data.setVal(i);
  17.             list.add(data);
  18.           }

  19.         int j = 0;
  20.         while (j < list.size()) {
  21.           Data tmp = (Data )list.get(j);
  22.           System.out.println("list(" + j + ") = " + tmp.getVal());
  23.           j++;
  24.         }
  25.   }
  26. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

6 个回复

倒序浏览
list(" + j + ") =  + 100
list(" + j + ") =  + 101
list(" + j + ") =  + 102
开始以为添加到 list集合里面的是对象的引用,所以认为结果应该是3行 list(" + j + ") =  + 102 ,后来测试了一下发现,添加到集合里面的是就是对象本身,而不是对象的引用,所以当后面引用的对象发生改变时,添加到集合里面的内容也发生了变化。个人愚见,不正确的地方还请大家指教。。楼主,你的头像细看之下很恐怖啊

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 陆强强 于 2012-7-4 16:57 编辑

for (int i=100; i<103; i++) {

            data.setVal(i);//101进去100都被函数初始化覆盖掉了,102进去101被函数初始化覆盖,所以getVal()返回的只有102

            list.add(data);//list添加的是3个对象都指向data,就像添加3个“a”字符串一样。list可以重复,如果是Set因为Data本身不可比要复写comparaTo所以也不存在这种现象
          }

回复 使用道具 举报
我感觉是因为主函数中只new了一个Data对象,
for (int i=100; i<103; i++) {
            data.setVal(i);
            list.add(data);
          }
该循环为data赋值了3次,可是最终的值是102,list中添加的是data的引用,还要明确一点,是new了一个对象,给该对象赋值了3次,可通过
       System.out.println(list.get(0));
          System.out.println(list.get(1));
          System.out.println(list.get(2));
发现打印输出是相同的,都是打印的指向data最终值102的引用。
回复 使用道具 举报
很想问一句,楼主,这种带格式的代码在发帖时怎么弄出来?谢谢!
回复 使用道具 举报
刘馨琪 发表于 2012-7-10 16:08
很想问一句,楼主,这种带格式的代码在发帖时怎么弄出来?谢谢!

你发帖的时候上边有一排编辑按钮  里边有一对括号<>点它就知道了
回复 使用道具 举报
蒋映辉 发表于 2012-7-10 16:12
你发帖的时候上边有一排编辑按钮  里边有一对括号点它就知道了

哦,好的,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马