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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 月夜之鬼魅 中级黑马   /  2013-10-23 18:51  /  1214 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 月夜之鬼魅 于 2013-10-25 19:13 编辑

class Date{
int val;
}
public class Test2{
  public static void main(String[] args)
  {
   Date data=new Date();
   ArrayList<Date> list=new ArrayList<Date>();
   for(int i=100;i<103;i++){
    data.val=i;
    list.add(data);      
   }
   for(Date d:list){
    System.out.println(d.val);//系统打印的是102;102;102
   }
  }
}
我就不明白虽然集合中添加的是对象,怎么添加到如何去运行的

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

4 个回复

正序浏览
斗胆潇洒 发表于 2013-10-23 22:55
分析:
         1、Data类的date位于栈中,new的具体内容位于堆区,这里都只是在使用一份,即一个Date对象 ...

谢谢,楼上这么一说,明白了,还有怎么提问结束啊。
回复 使用道具 举报
本帖最后由 斗胆潇洒 于 2013-10-23 23:05 编辑

分析:
         1、Data类的date位于栈中,new的具体内容位于堆区,这里都只是在使用一份,即一个Date对象
         2、date的val其实一直在随for变化,由100到102,但仅仅在改变同一个堆中的val
         3、val最终赋值为102,list调用add方法3次添加date,但都是在操作一个val
         4、当for输出list时,list的三个元素,其实都是指向同一份堆内容,所以结果为3个102
         
         原理:list仅仅将栈中的date值(对象的引用)作为元素添加进容器中,真正的对象内容是在由date指向的堆区。

那个,我那时这样写的,会有很好的分数哦,楼上都解释清楚了,我仅仅说一下答题格式(内容不要雷同),尽量以自己的话说清楚,短而精,老师看解释就是要一眼看清你说的什么,别密密麻麻哦

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
首先我们知道第一个for循环里执行了三次。
第一次---->i=100,
第一次---->i=101,
第一次---->i=102,
而for循环里面这句 list.add(data); 每次添加的都是同一个对象。改变的只是data对象里面那个val值。
从100变为了102.
ArraysList集合添加的3个对象都是你这个创建的Date data=new Date()对象。
所以System.out.println(d.val); 就打印为102,102,102.

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 阿里策 于 2013-10-23 19:08 编辑

    list集合中存放对象地址,通过增强for循环遍历出每一个对象的地址并赋值给data,这样就可以随意操作对象了。    楼主忽略了一点,你的data对象时在for循环开始时就已经存在了,你for循环操作的是同一个对象的val变量,只不过最后一次循环操作使得val变成了102.list中存放的三个元素是同一个对象的地址,所以每一个元素中的val也是相同的,就是最后的操作结果102 。
    如果你将Date data=new Date();放在第一个for循环中就会打印100,101,102。代码为证:
  1. import java.util.*;
  2. class Date{
  3.         int val;
  4. }
  5. class Test2{
  6.         public static void main(String[] args)
  7.         {
  8.                 //Date data=new Date();
  9.                 ArrayList<Date> list=new ArrayList<Date>();
  10.                 for(int i=100;i<103;i++){
  11.                         Date data=new Date();
  12.                         data.val=i;
  13.                         list.add(data);
  14.                         System.out.println(list);
  15.                 }
  16.                 for(Date d:list){
  17.                         System.out.println(d.val);//系统打印的是100;101;102
  18.                 }
  19.   }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马