黑马程序员技术交流社区
标题:
Collection集合保存的都是对象的引用,而不是保存对象的实例.
[打印本页]
作者:
liaorubei
时间:
2014-9-19 20:04
标题:
Collection集合保存的都是对象的引用,而不是保存对象的实例.
Collection集合里面保存的只是添加的对象的引用,而不是添加对象的实例.
如下面的代码:
import java.util.ArrayList;
class Data
{
int val;
}
class Test
{
public static void main(String args[])
{
Data data = new Data();
ArrayList<Data> list = new ArrayList<Data>();
for (int i = 100; i < 103; i++)
{
data.val = i;
list.add(data);
}
for (Data d : list)
{
System.out.println(d.val);
}
}
}
复制代码
打印之后其实都是同一个结果:102,就是最后一次给val字段赋值的结果
原因是因为Data是一个类,在主函数中,只实例化了一个data变量的对象,data变量的实例是一个引用类型,保存的堆内存中,这个实例的字段val也和对象的实例一起,也是保存在堆内存的,所以在第一个循环中,list每次添加的都是同一个对象的引用,而且由于data的val字段也是和data一起的.而且每次修改这个字段的值,都没有实例化新的对象,也就是说那个对象的引用一直没有改变,所以添加的只是同一个引用,到最后一次把val的值设为102,data还是原来的那个对象,添加的还是原来一样的引用,所以list添加了三次data,其实添加的是同一个对象的引用,并且这个对象在最后的循环中把val设为了102,所以在第二个循环打印的时候,其实打印的都是同样的引用指向的data对象的val字段的值.
给大家做一个复习:victory:
作者:
刘宣超
时间:
2014-9-19 20:56
是有点忘了,谢谢啊
作者:
曾小贤OL
时间:
2014-9-19 21:03
为什么亲友卷变成120黑马币了,坑啊!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2