黑马程序员技术交流社区

标题: Collection集合保存的都是对象的引用,而不是保存对象的实例. [打印本页]

作者: liaorubei    时间: 2014-9-19 20:04
标题: Collection集合保存的都是对象的引用,而不是保存对象的实例.
Collection集合里面保存的只是添加的对象的引用,而不是添加对象的实例.
如下面的代码:
  1. import java.util.ArrayList;

  2. class Data
  3. {
  4.         int val;
  5. }

  6. class Test
  7. {
  8.         public static void main(String args[])
  9.         {
  10.                 Data data = new Data();
  11.                 ArrayList<Data> list = new ArrayList<Data>();

  12.                 for (int i = 100; i < 103; i++)
  13.                 {
  14.                         data.val = i;
  15.                         list.add(data);
  16.                 }

  17.                 for (Data d : list)
  18.                 {
  19.                         System.out.println(d.val);
  20.                 }
  21.         }
  22. }
复制代码

打印之后其实都是同一个结果: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