黑马程序员技术交流社区
标题:
数据的疑惑
[打印本页]
作者:
不破大地
时间:
2013-6-1 18:10
标题:
数据的疑惑
Integer i=3;
System.out.println(i+13);
问题:i是引用类型,怎么能够和13直接相加呢,并且在eclipse中却能得到答案,其中的具体原理是怎样的?还请各位大侠赐教。。。。{:soso_e183:}
作者:
吴文彬
时间:
2013-6-1 18:22
在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 或以前,则会编译报错的。
作者:
花心々小土豆
时间:
2013-6-1 19:00
jdk 1.5 以后引入的新特性,自动拆箱和自动装箱。
自动装箱与拆箱的功能是编译器自动完成的。例如:
Integer i = 3;编译器在编译的时候解释为Integer i = new Integer(3);自动装箱。
i+13;编译器会解释为 i.intValue()+13; 自动拆箱。
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节得小心。
class demo1
{
public static void main(String[] args)
{
Integer i1 = 100;
Integer i2 = 100;
if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
class demo2
{
public static void main(String[] args)
{
Integer i3 = 200;
Integer i4 = 200;
if (i3 == i4)
System.out.println("i3 == i4");
else
System.out.println("i3 != i4");
}
}
复制代码
第一个输出结果:i1 = i2
第二个输出结果:i3 != i4
因为当数值在byte(–128到127)范围内容,对于新特性,如果该数值已经存在,则不会在开辟新的空间。
i1 和 i2指向了同一个Integer对象
i3 和 i4指向了不同Integer对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2