对象包装器和自动装箱
有时,需要将int这样的类型转化为对象。所有的基本类型都有一个与之对应的类。例如,Integer类对应基本类型int。通常,这些类称为包装器(wrapper)。这些对象包装器拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean(前6个类派生于公共的超类Number)。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器还是final,因此不能定义它们的子类。
例如:
ArrayList<Integer> list = new ArrayList<>();
下面这个调用:
list.add(3);
将自动地变成:
list.add(Integer.valueOf(3));
这种变换被称为自动装箱。
相反地,当将一个Integer类型对象赋值给一个int值时,将会自动拆箱。也就是说,编译器将下列语句:
int n = list.get(i);
翻译成:
int n = list.get(i).intValue();
关于自动装箱还有以下几点需要说明。首先,由于包装器类引用可以为null,所以自动装箱可能会抛出一个NullPointerException:
Integer n = null;
System.out.println(2 * n); // Throws NullPointerException
另外,如果在一个表达式中混合使用Integer和Double类型,Integer值就会拆箱,提升为double,再装箱为Double:
Integer n = 1;
Double x = 2.0;
System.out.println(true ? n : x); // Prints 1.0
最后,自动装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。

本文介绍了Java中对象包装器的概念及其应用,包括Integer等类如何对应基本数据类型,并详细解释了自动装箱和自动拆箱的过程及注意事项。

被折叠的 条评论
为什么被折叠?



