黑马程序员技术交流社区

标题: 这段代码把我搞昏头了! [打印本页]

作者: 李能甫    时间: 2015-4-2 20:26
标题: 这段代码把我搞昏头了!
  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.       }
复制代码


作者: lrd7512369    时间: 2015-4-2 20:29
只new了一个Data对象,你可以对集合中的三个Data判断是否==,它们都是一样的,每次都是给同一个Data对象的val赋值
作者: 43453186@qq.com    时间: 2015-4-2 20:39
是不是打印100/101/102这三个数字啊
作者: 百思不得解    时间: 2015-4-2 20:40
你是哪里不明白呢
作者: lwj123    时间: 2015-4-2 20:57
这样做是错误的,打印的值应该是102
因为你值创建了一个对象,每次循环赋值时实质上是改变变量的值而已。
将类对象村方法到集合中应该是一个类中不同的对象才是对的
所以你每次存对象时,都应该new 然后再对new的对象赋值
之后存放到集合中
作者: 山里孩子    时间: 2015-4-2 21:19
  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类的对象
  8.                            Data data = new Data();
  9.                                 //创建ArrayList集合,指定类型为自定义的Data类类型
  10.                            ArrayList<Data> list = new ArrayList<Data>();
  11.                         //循环对Data中的变量val赋值
  12.                    for (int i = 100; i < 103; i++) {

  13.                                    data.val = i;
  14.                                 //使用ArrayList中的add方法添加数据
  15.                                    list.add(data);
  16.                    }
  17.                         //使用增强for循环对List集合输出
  18.                         for (Data d : list) {
  19.                                   System.out.println(d.val);
  20.                    }

  21.          }

  22. }
复制代码



作者: 殷俊    时间: 2015-4-2 21:21
果真是陷阱,领教了,一直都是一个对象的i值在变化,因此只取了最后一个值,额,这一不小心就上当了{:2_30:}
作者: tubao1991    时间: 2015-4-2 21:39
没看懂楼主你是想表达什么。
作者: 364785953    时间: 2015-4-2 21:45
头晕~~~~~~~~~~~~~~~
作者: longlongint    时间: 2015-4-2 22:03
这是在逗我么,最后输出d.val不是输出val的值么 不就是三个102?
作者: z47057554    时间: 2015-4-2 22:47
内存中只有一个Data的对象,集合中存了这个对象的引用三次,你改变了对象中的内容三次,每次改变都操作的同一个对象,后面的操作会覆盖掉前面的操作,最后又把这个对象中的值打印了三次
作者: 李能甫    时间: 2015-4-3 08:46
43453186@qq.com 发表于 2015-4-2 20:39
是不是打印100/101/102这三个数字啊

打印的是三个102
作者: 懒的呼吸    时间: 2015-4-3 08:54
又注意到小细节了~长知识了
作者: 胡几手    时间: 2015-4-3 09:22
看不懂。。。。。
作者: 43453186@qq.com    时间: 2015-4-3 21:27
长见识了。。。




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