黑马程序员技术交流社区

标题: 打印结果怎么是这个啊? [打印本页]

作者: 李强    时间: 2012-4-29 00:35
标题: 打印结果怎么是这个啊?
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

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

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

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


作者: 金超    时间: 2012-4-29 00:57
应该是这个结果
list(0) = 100
list(1) = 101
list(2) = 102
作者: 黄秋    时间: 2012-4-29 07:32
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 对象,……。
作者: 罗旭维    时间: 2012-4-29 08:00
打印的结果是:
list(0) = 102
list(1) = 102
list(2) = 102
list虽然添加了3次但都是同一个对象data。
在for循环中添加元素的时候每次执行”data.setVal(i);“都重新设置了data的值,
所以data最终的值是最后一次执行”data.setVal(i);“后的值就是102,
作者: 根号5    时间: 2012-4-29 08:53
你这个题的打印结果是:
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

作者: 根号5    时间: 2012-4-29 11:39
顶一下  




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