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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不破大地 中级黑马   /  2013-6-1 18:10  /  1288 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Integer i=3;
System.out.println(i+13);
问题:i是引用类型,怎么能够和13直接相加呢,并且在eclipse中却能得到答案,其中的具体原理是怎样的?还请各位大侠赐教。。。。{:soso_e183:}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

2 个回复

倒序浏览
在jdk1.5 以后,引入了自动装箱、拆箱.
所谓装箱,就是把基本数据类型用他们相对应的引用类型包起来,使他们可以具有对象的特质,如我们可以把int型包装成Integer类的对象等等。
拆箱那就是跟装箱的方向相反。
自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动的封装到与它相同类型的包装中。
Integer i = 3; //没有通过使用new 来显示建立,java自动完成。
自动拆箱,只需要将该对象赋给一个基本数据类型即可。
例如:
int i = 11;
Integer j = i; //自动装箱。
int k = j;// 自动拆箱。

System.out.println(i+13); // 这个语句,实际执行的时候,编译器,先把 i 自动拆箱转化为 基本数据类型,然后与13相加。
这个特性是jdk1.5 才有的。
楼主可以把编译器环境调到jdk1.4 或以前,则会编译报错的。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
jdk 1.5 以后引入的新特性,自动拆箱和自动装箱。
自动装箱与拆箱的功能是编译器自动完成的。例如:
Integer i = 3;编译器在编译的时候解释为Integer i = new Integer(3);自动装箱。
i+13;编译器会解释为 i.intValue()+13; 自动拆箱。
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节得小心。
  1. class demo1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Integer i1 = 100;
  6.                 Integer i2 = 100;
  7.                 if (i1 == i2)
  8.                         System.out.println("i1 == i2");
  9.                 else
  10.                         System.out.println("i1 != i2");
  11.         }
  12. }
  13. class demo2
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Integer i3 = 200;
  18.                 Integer i4 = 200;
  19.                 if (i3 == i4)
  20.                         System.out.println("i3 == i4");
  21.                 else
  22.                         System.out.println("i3 != i4");
  23.         }
  24. }
复制代码
第一个输出结果:i1 = i2
第二个输出结果:i3 != i4
因为当数值在byte(–128到127)范围内容,对于新特性,如果该数值已经存在,则不会在开辟新的空间。
i1 和 i2指向了同一个Integer对象
i3 和 i4指向了不同Integer对象

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马