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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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:

2 个回复

倒序浏览
是有点忘了,谢谢啊
回复 使用道具 举报

为什么亲友卷变成120黑马币了,坑啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马