一、装箱
我们先看装箱,有如下代码:
public class Box {
public void packing() {
Integer i = 1;
Float f = 2.0f;
Long L = 3L;
Boolean b = true;
Short s = 5;
Double d = 6.0;
Character c = 'A';
Byte t = 7;
}
}
我们用javac编译该段代码,然后利用javap反编译这段代码,看看结果:
请注意,蓝线画出来的部分,所有的装箱类型都调用了自己的valueOf方法。
用jd-gui反编译出直观的结果:
这样,我们就能直观的看出装箱的时候,都发生了什么。
二、拆箱:
看如下代码
public class Box {
public void unBox() {
Integer i = Integer.valueOf(1);
Short s = Short.valueOf((short)2);
Byte b = Byte.valueOf((byte)3);
Boolean t = Boolean.TRUE;
Character c = Character.valueOf('A');
Double d = Double.valueOf(6.0D);
Float f = Float.valueOf(7.0F);
Long g = Long.valueOf(8L);
//拆箱部分
int one = i;
short two = s;
byte three = b;
boolean four = t;
char five = c;
double six = d;
float seven = f;
long eight = g;
}
}
在JDK1.8.0_151的环境下,使用javac编译这段代码,得到Box.class,然后利用javap反编译字节码文件Box.class,截取了拆箱部分反编译结果,得到下图:
大家注意划蓝线的部分,可以看出在拆箱时,装箱类型都调用了各自的xxValue()方法。
借助于jd-gui,我们更直观的看到这个过程:
我们改造一下,上面的代码,改成这样:
public class Box {
public void unBox() {
Integer i = Integer.valueOf(1);
Short s = Short.valueOf((short)2);
Byte b = Byte.valueOf((byte)3);
Boolean t = Boolean.TRUE;
Character c = Character.valueOf('A');
Double d = Double.valueOf(6.0D);
Float f = Float.valueOf(7.0F);
Long g = Long.valueOf(8L);
//拆箱部分
int one = i.intValue();
short two = s.shortValue();
byte three = b.byteValue();
boolean four = t.booleanValue();
char five = c.charValue();
double six = d.doubleValue();
float seven = f.floatValue();
long eight = g.longValue();
}
}
在JDK1.8.0_151的环境下,使用javac编译这段代码,然后利用javap,看看反编译结果怎么样?
结果和上面的一模一样。
三、结论:
(1)装箱时,调用装箱类型各自的valueOf(xx value)方法。
(2)拆箱时,调用装箱类型各自的xxValue方法。
【说明】:xx代表基本类型,如boolean、char、int等。