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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yang649981273 中级黑马   /  2014-9-23 15:51  /  4009 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

点评

无语了,这么赤裸裸地求答案  发表于 2014-9-23 16:20

16 个回复

倒序浏览
你这个是,,,测试题目啊,看起来蛮容易的吧.
回复 使用道具 举报
我还是说一下吧,List集合保存的是元素的引用,而不是元素的实例,
  Data data = new Data();是实例化一个Data对象,这个对象保存在堆内存中,其中字段val也保存在堆内存中和data对象同存亡
  在List添加data对象之前只是修改了data对象的val字段的值,但是并没有重新实例化对象
  所以在循环中List添加的都是同一个引用,
  在退出第一个循环的时候,对这个对象的val字段进行了最后一次赋值为102
  因为List添加的是同一个引用,所以在打印结果的时候,打印的也是同一个引用的最后一次被修改的值.
  最后一次赋值的是102,所以三次打印的结果都是102

点评

学习  发表于 2015-5-31 13:04

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报 3 1
只new出来了一个对象,这个对象一直指向val变量,变得只是val的值,所以结果看最后赋的值。

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
因为只创建了一个Data对象,在for循环中,循环三次添加的都是同一个Data对象的引用。而Data中的val也是唯一的,
* 三次循环在做着覆盖的操作,val的值为最后循环i的值,为102。在增强for循环中,对集合中元素进行遍历,三次打印的是
* 同一个值102,相当于System.out.println(Data.val)语句被执行了三次

点评

加油  发表于 2015-5-31 13:51
回复 使用道具 举报
不错不错。
回复 使用道具 举报
嗯  学习了
回复 使用道具 举报
2L总结的很全面
回复 使用道具 举报
wyd1 中级黑马 2015-9-15 20:59:53
9#
为什么集合中会有3个Data对象呢?如果这样说应该是只打印1个对象出来啊
回复 使用道具 举报
  我也有这道
回复 使用道具 举报
liaorubei 发表于 2014-9-23 16:15
我还是说一下吧,List集合保存的是元素的引用,而不是元素的实例,
  Data data = new Data();是实例化一个Dat ...

学习了,。。。。。。。。。。
回复 使用道具 举报
我的测试也是这个题
回复 使用道具 举报
学到了66 6 6666
回复 使用道具 举报
受教了谢谢QAQ
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马