黑马程序员技术交流社区

标题: 帮我分析下结果,要每一步的过程 [打印本页]

作者: yang649981273    时间: 2014-9-23 15:51
标题: 帮我分析下结果,要每一步的过程
  1. package com.itheima;
  2. /*分析运行结果,说明原理。(没有分析结果不得分)*/
  3. import java.util.ArrayList;

  4. class Data {
  5.     int val;
  6. }

  7. public class Test3 {
  8.           public static void main(String args[]) {
  9.                    Data data = new Data();
  10.                    ArrayList<Data> list = new ArrayList<Data>();

  11.            for (int i = 100; i < 103; i++) {
  12.                    data.val = i;
  13.                    list.add(data);
  14.            }

  15.             for (Data d : list) {
  16.                   System.out.println(d.val);
  17.            }
  18.      }
  19. }
复制代码

作者: liaorubei    时间: 2014-9-23 15:52
你这个是,,,测试题目啊,看起来蛮容易的吧.
作者: liaorubei    时间: 2014-9-23 16:15
我还是说一下吧,List集合保存的是元素的引用,而不是元素的实例,
  Data data = new Data();是实例化一个Data对象,这个对象保存在堆内存中,其中字段val也保存在堆内存中和data对象同存亡
  在List添加data对象之前只是修改了data对象的val字段的值,但是并没有重新实例化对象
  所以在循环中List添加的都是同一个引用,
  在退出第一个循环的时候,对这个对象的val字段进行了最后一次赋值为102
  因为List添加的是同一个引用,所以在打印结果的时候,打印的也是同一个引用的最后一次被修改的值.
  最后一次赋值的是102,所以三次打印的结果都是102
作者: King_L    时间: 2014-9-23 16:17
只new出来了一个对象,这个对象一直指向val变量,变得只是val的值,所以结果看最后赋的值。
作者: 佟金    时间: 2015-3-15 10:01
因为只创建了一个Data对象,在for循环中,循环三次添加的都是同一个Data对象的引用。而Data中的val也是唯一的,
* 三次循环在做着覆盖的操作,val的值为最后循环i的值,为102。在增强for循环中,对集合中元素进行遍历,三次打印的是
* 同一个值102,相当于System.out.println(Data.val)语句被执行了三次
作者: xiaoxinxin003    时间: 2015-7-17 02:43
不错不错。
作者: 千山万水    时间: 2015-8-11 09:54
嗯  学习了
作者: TheBadboy    时间: 2015-8-20 08:34
2L总结的很全面
作者: wyd1    时间: 2015-9-15 20:59
为什么集合中会有3个Data对象呢?如果这样说应该是只打印1个对象出来啊
作者: 兴许不接客    时间: 2015-10-15 21:53
  我也有这道
作者: 背包客    时间: 2015-11-6 10:22
liaorubei 发表于 2014-9-23 16:15
我还是说一下吧,List集合保存的是元素的引用,而不是元素的实例,
  Data data = new Data();是实例化一个Dat ...

学习了,。。。。。。。。。。
作者: 云在青天    时间: 2015-11-28 10:13
我的测试也是这个题
作者: sunpeijie    时间: 2015-12-24 20:22
学到了66 6 6666
作者: 天橙星    时间: 2016-1-23 10:14
受教了谢谢QAQ




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