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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁银凤 初级黑马   /  2013-8-14 21:40  /  1037 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁银凤 于 2013-8-14 23:05 编辑
  1.         import java.util.ArrayList;

  2.         class Data {
  3.             int val;
  4.         }

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

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

  13.                     for (Data d : list) {
  14.                           System.out.println(d.val);
  15.                    }
  16.              }
  17.       }
复制代码
运行结果都是102,有点迷糊,望前辈们给醍醐灌顶一下!

评分

参与人数 1技术分 +1 收起 理由
张俊生 + 1 神马都是浮云

查看全部评分

3 个回复

倒序浏览
你这样写的话,Data只new了一次,所以list中加了三个相同的对象,并且这个对象中的属性val被赋了三次值,最后一次赋的值是102,

你把Data data = new Data();放入for循环里面就达到你要的效果了。。
  1. for (int i = 100; i < 103; i++) {
  2.                         Data data = new Data();
  3.                         data.val = i;
  4.                         list.add(data);
  5.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张俊生 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
首先你的List泛型时Data,也就是list中装的是Data对象的地址,而你只创建了一个对象,所以无论你添加多少次都是这一个对象的地址,你的for循环改变的是变量val的值,也就是说Data对象的val变量值在一次次被覆盖,循环结束后,你的Data对象中只有一个val =102,而你的list中装的又都是同一个对象的地址,所以增强for打印出来的结果是3个102.
你要看到三个不同的变量值,要创建3个对象,所以把创建对象也写到for循环里
  1. import java.util.ArrayList;

  2. class Data {
  3.         int val;
  4. }

  5. public class Test {
  6.         public static void main(String args[]) {

  7.                 ArrayList<Data> list = new ArrayList<Data>();

  8.                 for (int i = 100; i < 103; i++) {
  9.                        
  10.                         //三个对象各自对应自己的val,val就有三个值了
  11.                         Data data = new Data();
  12.                         data.val = i;
  13.                         list.add(data);
  14.                 }

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

评分

参与人数 1技术分 +1 收起 理由
张俊生 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报 1 0
高波 发表于 2013-8-14 22:21
首先你的List泛型时Data,也就是list中装的是Data对象的地址,而你只创建了一个对象,所以无论你添加多少次 ...

正好也想明白了,不过你的解答更全面一些!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马