黑马程序员技术交流社区

标题: 和大家一起探讨下老毕源码day22中的面试题之七 [打印本页]

作者: 张立江    时间: 2012-7-4 14:56
标题: 和大家一起探讨下老毕源码day22中的面试题之七
本帖最后由 小张童鞋 于 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. }
复制代码

作者: 王海宇    时间: 2012-7-4 16:41
list(" + j + ") =  + 100
list(" + j + ") =  + 101
list(" + j + ") =  + 102
开始以为添加到 list集合里面的是对象的引用,所以认为结果应该是3行 list(" + j + ") =  + 102 ,后来测试了一下发现,添加到集合里面的是就是对象本身,而不是对象的引用,所以当后面引用的对象发生改变时,添加到集合里面的内容也发生了变化。个人愚见,不正确的地方还请大家指教。。楼主,你的头像细看之下很恐怖啊
作者: 陆强强    时间: 2012-7-4 16:52
本帖最后由 陆强强 于 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所以也不存在这种现象
          }


作者: 王宝康    时间: 2012-7-8 01:02
我感觉是因为主函数中只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
刘馨琪 发表于 2012-7-10 16:08
很想问一句,楼主,这种带格式的代码在发帖时怎么弄出来?谢谢!

你发帖的时候上边有一排编辑按钮  里边有一对括号<>点它就知道了
作者: 党巾水    时间: 2012-7-10 16:29
蒋映辉 发表于 2012-7-10 16:12
你发帖的时候上边有一排编辑按钮  里边有一对括号点它就知道了

哦,好的,谢谢!




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