自动装箱(autoboxing)和拆箱(unboxing):将基本数据类型和包装类自动转换。
自动装箱:
基本类型的数据处于需要对象的环境中时,会自动转为“对象”。
以 Integer 为例:
Integer i = 5;
编译器会自动转成:Integer i = Integer.valueOf(5),这就是 Java 的自动装箱。
自动装箱:
每当需要一个值时,对象会自动转成基本数据类型,没必要再去显示调用 intVaule()、doubleValue()等转型方法。
Integer i = Integer.valueOf(5);
int j = i;
编译器会自动转成:int j = i.intValue();
这样的过程就是自动拆箱。
自动装箱/拆箱的本质是:
自动装箱与拆箱的功能是编译器来帮忙,编译器在编译时依据所编写的语法,决定是进行装箱或拆箱动作。
自动装箱:
Integer i = 100;//自动装箱
//相当于编译器自动为您作以下的语法编译:
Integer i = Integer.valueOf(100); //调用的是valueOf(100),而不是new Integer(100)
自动装箱与拆箱的功能是所谓的“编译器蜜糖”,虽然使用这个功能很方便,但在程序运行阶段需了解Java的语义。如下所示的程序是可以通过编译的:
包装类空指针异常问题:
public class Test1{public static void main(String[] args){Integer i = null;int j = i;}
}
执行结果如图所示:
运行结果之所以会出现空指针异常,是因为如上代码相当于:
public class Test1{public static void main(String[] args){Integer i = null;//int j = i;//以上一行代码在编译时期是合法的,但是在运行时期会有错误,因为其相当于下面的代码int j = i.intValue();}
}