黑马程序员技术交流社区

标题: 分析下原因,要仔细的 [打印本页]

作者: 月夜之鬼魅    时间: 2013-10-23 18:51
标题: 分析下原因,要仔细的
本帖最后由 月夜之鬼魅 于 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
   }
  }
}
我就不明白虽然集合中添加的是对象,怎么添加到如何去运行的

作者: 阿里策    时间: 2013-10-23 19:05
本帖最后由 阿里策 于 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. }
复制代码

作者: 亲雨泽    时间: 2013-10-23 19:06
首先我们知道第一个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.

作者: 斗胆潇洒    时间: 2013-10-23 22:55
本帖最后由 斗胆潇洒 于 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指向的堆区。

那个,我那时这样写的,会有很好的分数哦,楼上都解释清楚了,我仅仅说一下答题格式(内容不要雷同),尽量以自己的话说清楚,短而精,老师看解释就是要一眼看清你说的什么,别密密麻麻哦
作者: 月夜之鬼魅    时间: 2013-10-24 20:27
斗胆潇洒 发表于 2013-10-23 22:55
分析:
         1、Data类的date位于栈中,new的具体内容位于堆区,这里都只是在使用一份,即一个Date对象 ...

谢谢,楼上这么一说,明白了,还有怎么提问结束啊。




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