黑马程序员技术交流社区

标题: 入学考试分析题,不太懂 [打印本页]

作者: 杨希    时间: 2014-9-18 16:14
标题: 入学考试分析题,不太懂
大家能帮我看看这道题吗,说实话我也不知道结果为什么是102,102,102,能详细分析一下吗,谢谢
  1. public class a111a {

  2.         public static void main(String[] args) {
  3.                
  4.                  Data data = new Data();
  5.                  
  6.          ArrayList<Data> list = new ArrayList<Data>();

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

  11.   for (Data d : list) {
  12.         System.out.println(d.val);

  13. }

  14.         }

  15. }
  16. class Data {
  17.     int val;
  18. }
复制代码




作者: Fightin黑马    时间: 2014-9-18 21:42
因为你只new了一个对象呀, 集合里面的三个地址都是一个Data对象的, data.val= i;  改变了val3次属性,最后就是102了.
要new 3个对象才有你想要的效果
作者: hejinzhong    时间: 2014-9-18 22:56
因为你list中存的是对象,而且一直对同一个对象进行操作
作者: yuli2039    时间: 2014-9-18 23:02
new了一个对象,对这个对象的成员变量赋了三次值,当然以最后一次赋值为准。相当于int a=0; a=1; a=2;syso(a);//这里a当然等于2
作者: 谢建平    时间: 2014-9-19 06:14
一个对象  赋值一次后           再拷贝到集合, 一共拷贝三份到集合
作者: 菜鸟一号    时间: 2014-9-19 08:53
谢谢楼主的分享,谢谢各位的评点
作者: 杨希    时间: 2014-9-19 17:31
Fightin黑马 发表于 2014-9-18 21:42
因为你只new了一个对象呀, 集合里面的三个地址都是一个Data对象的, data.val= i;  改变了val3次属性,最后就 ...

谢谢,自己也查过资料了,也懂了,你说的也很好
作者: clh    时间: 2014-9-19 17:51
会被覆盖
作者: 爽朗的菜籽    时间: 2014-9-19 20:12
  1. import java.util.ArrayList;


  2. public class ArrayListDemo
  3. {

  4.         public static void main(String[] args)
  5.         {
  6.                 ArrayList<Integer> al = new ArrayList<Integer>();
  7.                 Integer itg = new Integer(5);
  8.                 for(int i=0; i<3; i++)
  9.                 {
  10.                         itg = i;
  11.                         al.add(itg);
  12.                 }
  13.                
  14.                 for(int i:al)
  15.                 {
  16.                         System.out.println(i);
  17.                 }
  18.         }

  19. }
复制代码

可是这个的答案是0 1 2.。。晕了
作者: 曾小贤OL    时间: 2014-9-19 20:33

为什么亲友卷变成120黑马币了,坑啊!
作者: 李东东    时间: 2014-9-19 20:58
为什么我复制你的代码不能编译呢?
作者: Aaron_H    时间: 2014-9-19 21:11
  1.         public static void main(String[] args) {
  2.                 //看这里,在这里new出一个Data对象
  3.                 Data data = new Data();
  4.                
  5.                 ArrayList<Data> list = new ArrayList<Data>();
  6.                 for (int i = 100; i < 103; i++) {
  7.                 //在这里每一次操作的都是上面的这个对象,val的值被重写的三次,有效值是最后一次的值
  8.                  data.val= i;  
  9.                  //在这里把Data对象添加进list,虽然添加了三次,但每一次添加的都是相同的地址,都是指向同一个对象
  10.                  list.add(data);
  11.                 }
  12.                 //就是说虽然这个list中有三个地址,但都是一个东西,遍历的时候循环了三次,都是一个对象
  13.   for (Data d : list) {
  14.         System.out.println(d.val);
  15.   }
  16.         }

  17. }
  18. class Data {
  19.     int val;
  20. }
复制代码

给你加上了注释,能力有限,只总结了这么多
作者: 高泳    时间: 2014-9-19 21:23
new了一个对象data,在list中添加了三次地址,不过三次地址都是data的,最终data赋值102,所以输出了三个102.




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