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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华东 中级黑马   /  2012-9-28 16:33  /  1656 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. public class Test3 {

  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args)
  6. {
  7. int[] arr1=new int[5];
  8. arr1[0]=554;
  9. arr1[1]=858;
  10. arr1[2]=25;
  11. arr1[3]=88;
  12. arr1[4]=2852;//请问:数组arr中存储的是对象吗??

  13. /*
  14. * 如果不是!请看下面一组!
  15. */
  16. Integer a0=new Integer(554);
  17. Integer a1=new Integer(858);
  18. Integer a2=new Integer(25);
  19. Integer a3=new Integer(88);
  20. Integer a4=new Integer(2852);
  21. int[] arr2=new int[5];
  22. arr2[0]=a0;
  23. arr2[1]=a1;
  24. arr2[2]=a2;
  25. arr2[3]=a3;
  26. arr2[4]=a4;
  27. //疑问出来了:请问拆箱后a0,a1,a2,a3,a4 还指向先前的地址值吗?
  28. // 换句话说:拆箱后,他们的地址值还存在不?堆内存中还有他们的实体对象吗?
  29. }

  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 翁鹏 于 2012-9-28 16:59 编辑

第一个问题:第一个int数组存储的是基本数据类型int,不是包装类对象。你的第一个问题和自动装箱,拆箱没关系。

然后你创了5个Integer对象。然后把5个Integer对象的引用传给了第二个int数组。这个时候发生自动拆箱。

Integer对象的引用还是指向原来的对象,你在代码里又没有改变Integer对象的引用,即你并没有改变引用指向的地址值。

例如:你把Integer对象的引用改了a0 = null ; a1 = null ;  这个时候对象还存在内存中,但引用已经不指向对象了,因为被我修改为空了,没有引用的对象标记为可回收状态,等待Java的垃圾回收线程把它回收。

反正就是你这里只把引用赋值给了数组,但没有把引用给 更改 了,所以还是指向原对象!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
请继续说完剩下的拆箱问题。万分感谢
回复 使用道具 举报
翁鹏 发表于 2012-9-28 16:39
第一个问题:int数组存储的是基本数据类型int,不是包装类对象。你的第一个问题和自动装箱,拆箱没关系。 ...

请继续说完剩下的拆箱问题。万分感谢
回复 使用道具 举报
在堆中,对Integer类型的变量,有常量池,池中有-128-127的Integer值。不论几个这样的值,都指向一个对象。

其他的值,在堆中都有各自对象,几个值就指向几个对象。

本题中,int型数组中存放的不是对象,是基本类型。

对于拆包赋值,其实质是调用Integer的valueOf方法拿到引用的值。所以,Integer数组中的各对象引用依然指向其在堆中的数据。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张 涛 发表于 2012-9-28 16:46
在堆中,对Integer类型的变量,有常量池,池中有-128-127的Integer值。不论几个这样的值,都指向一个对象。 ...

谢谢  问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马