黑马程序员技术交流社区
标题:
分析下原因,要仔细的
[打印本页]
作者:
月夜之鬼魅
时间:
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。代码为证:
import java.util.*;
class Date{
int val;
}
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++){
Date data=new Date();
data.val=i;
list.add(data);
System.out.println(list);
}
for(Date d:list){
System.out.println(d.val);//系统打印的是100;101;102
}
}
}
复制代码
作者:
亲雨泽
时间:
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