自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。例如:Integer i = 100; 相当于编译器自动为您作以下的语法编译:Integer i = new Integer(100);! L$ {: E6 V: q+ g
所以自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的:
* y3 E+ M' |* d9 e# }% [ Integer i = null;
% y: O7 w% o4 E z2 r6 s int j = i;4 ]) u G2 s* R3 s$ n8 r
这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于: r& _# I% x/ P& ]
Integer i = null;
$ a) E; s: O \. `; @ int j = i.intValue();, C0 L+ Z! P0 O( U& H, D
null表示i没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。5 j+ Z* Z, v. p9 [, }( a
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心。再来看范例4.6,您认为结果是什么呢?8 t; t2 W" d+ H& U
范例4.6 AutoBoxDemo2.java 8 f9 h' M% c2 l/ v* s' o
public class AutoBoxDemo2 {
5 j3 H" d* k& h' e1 L public static void main(String[] args) { 5 ~% b6 V$ L' u! ^% y
Integer i1 = 100;
9 J+ X7 w$ Q, S: M Integer i2 = 100;
- W+ E, @9 o; f9 C- b7 H# M0 J if (i1 == i2) - B8 p0 m$ A7 H* U5 b; a2 d
System.out.println("i1 == i2"); " k0 a) H' b- r9 [8 H
else 4 p, F; d Q/ u0 ^
System.out.println("i1 != i2");
5 D& Q; y" J1 W% t+ e } $ O$ `7 U2 e0 P5 V P: v
9 O* z3 j3 ^% K. w' f0 k) r
} |