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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨希 中级黑马   /  2014-9-18 16:14  /  2094 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家能帮我看看这道题吗,说实话我也不知道结果为什么是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. }
复制代码



12 个回复

倒序浏览
因为你只new了一个对象呀, 集合里面的三个地址都是一个Data对象的, data.val= i;  改变了val3次属性,最后就是102了.
要new 3个对象才有你想要的效果
回复 使用道具 举报
因为你list中存的是对象,而且一直对同一个对象进行操作
回复 使用道具 举报
new了一个对象,对这个对象的成员变量赋了三次值,当然以最后一次赋值为准。相当于int a=0; a=1; a=2;syso(a);//这里a当然等于2
回复 使用道具 举报
一个对象  赋值一次后           再拷贝到集合, 一共拷贝三份到集合
回复 使用道具 举报
谢谢楼主的分享,谢谢各位的评点
回复 使用道具 举报
杨希 中级黑马 2014-9-19 17:31:10
7#
Fightin黑马 发表于 2014-9-18 21:42
因为你只new了一个对象呀, 集合里面的三个地址都是一个Data对象的, data.val= i;  改变了val3次属性,最后就 ...

谢谢,自己也查过资料了,也懂了,你说的也很好
回复 使用道具 举报
clh 中级黑马 2014-9-19 17:51:28
8#
会被覆盖
回复 使用道具 举报
  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.。。晕了
回复 使用道具 举报

为什么亲友卷变成120黑马币了,坑啊!
回复 使用道具 举报
为什么我复制你的代码不能编译呢?
回复 使用道具 举报
  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. }
复制代码

给你加上了注释,能力有限,只总结了这么多
回复 使用道具 举报
new了一个对象data,在list中添加了三次地址,不过三次地址都是data的,最终data赋值102,所以输出了三个102.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马