1 自动装箱
把基本数据类型转换为对应的包装类类型
Integer i = 100;//自动装箱 //相当于编译器自动为您作以下的语法编译: Integer i = Integer.valueOf(100);//调用的是valueOf(100),而不是new Integer(100)
2 自动拆箱
把包装类类型转换为对应的基本数据类型
Integer i = 100; int j = i;//自动拆箱 //相当于编译器自动为您作以下的语法编译: int j = i.intValue();
所以自动装箱与拆箱的功能是所谓的“编译器蜜糖(Compiler Sugar)”,虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义
3 包装类空指针异常问题:
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.intValue(); } }
null表示i没有指向任何对象的实体,但作为对象名称是合法的(不管这个对象名称存是否指向了某个对象的实体)。由于实际上i并没有指向任何对象的实体,所以也就不可能操作intValue()方法,这样上面的写法在运行时就会出现NullPointerException错误。
4 自动装箱与拆箱
public class Test2 { /** * 测试自动装箱和拆箱 结论:虽然很方便,但是如果不熟悉特殊情况,可能会出错! */ public static void main(String[] args) { Integer b = 23; // 自动装箱 int a = new Integer(20); //自动拆箱 // 下面的问题我们需要注意: Integer c = null; int d = c; // 此处其实就是:c.intValue(),因此抛空指针异常。 } }