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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李强 初级黑马   /  2012-4-29 00:35  /  2288 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Data {
       int   val;
       int   getVal() {
              returnval;
       }
       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);
           list.add(data);
         }
       int j = 0;
       while (j < list.size()) {
         Data tmp = (Data )list.get(j);
         System.out.println("list(" + j + ") = " +tmp.getVal());
         j++;
       }
  }
}


看了看结果没有明白?怎么会输出都一样呢?list(0)=102

6 个回复

倒序浏览
这个不是一个面试题吗?
好好分析一下就行了,哥们建议你多画画图,这个是我们刚做过的一道练习题,给你简单分析一下吧,明天还得上课呢,这个分不好赚啊!!
第一部分存储对象3个data到list中。同时修改data中的val值我们不用管他了多少,记住最总的值就行了。
第二部分输出list中对象对应的value值,list中存储的是对象地址,在这个题自始自终都是一个对象在变化,所以做种的list中的地址所对应的data对象值都是一样的,输出的data都是一个,data的val也当然是一个了

哦了,今天老师貌似在放分啊,期待!

睡觉了明天还得上课呢,有问题留言或Q我:443883861

回复 使用道具 举报
应该是这个结果
list(0) = 100
list(1) = 101
list(2) = 102
回复 使用道具 举报
1. LZ 不是说“怎么会输出都一样呢?list(0)=102”吗?以为是100,101,102;
2. 其实,Data data = new Data(); 在整个程序中只执行一次,也就是说只 new 一个Data 对象,故 data.setVal(i); 是同一个对象在设置值,会将原有的 Val 值覆盖;
3. 把 Data data = new Data(); 移到 for 循环内,这样每循环一次,就new 一个Data 对象,……。
回复 使用道具 举报
打印的结果是:
list(0) = 102
list(1) = 102
list(2) = 102
list虽然添加了3次但都是同一个对象data。
在for循环中添加元素的时候每次执行”data.setVal(i);“都重新设置了data的值,
所以data最终的值是最后一次执行”data.setVal(i);“后的值就是102,
回复 使用道具 举报
你这个题的打印结果是:
list(0) = 102;
list(1) = 102;
list(3) = 102;
这主要是因为你往list中add的全是同一个Data对象,for循环全是改的同一个对象的成员变量val,所以后面的会把前面的改的 val  覆盖掉。
我改了一下你的代码,能出现你想要的效果,如下:
package com.bosi;

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[])
        {
               
                ArrayList list = new ArrayList();
                for (int i = 100; i < 103; i++)
                {
                        Data data = new Data();//关键问题在这里,把创建对象的表达式放到for循环中来,这样的话list每次add的都是一个
                                                       //新的Data对象,这样的话就可以打印出正确结果

                        data.setVal(i);
                        list.add(data);
                }
                int j = 0;
                while (j < list.size())
                {
                        Data tmp = (Data) list.get(j);
                        System.out.println("list(" + j + ") = " + tmp.getVal());
                        j++;
                }
        }
}
打印结果是:
list(0) = 100
list(1) = 101
list(2) = 102
回复 使用道具 举报
顶一下  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马