对象包装器和自动装箱

来源:互联网 发布:提高英语水平的软件 编辑:程序博客网 时间:2024/05/17 07:27

对象包装器和自动装箱

有时,需要将int这样的类型转化为对象。所有的基本类型都有一个与之对应的类。例如,Integer类对应基本类型int。通常,这些类称为包装器(wrapper)。这些对象包装器拥有很明显的名字:IntegerLongFloatDoubleShortByteCharacterVoidBoolean(前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

另外,如果在一个表达式中混合使用IntegerDouble类型,Integer值就会拆箱,提升为double,再装箱为Double

Integer n = 1;Double x = 2.0;System.out.println(true ? n : x); // Prints 1.0

最后,自动装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。

0 0
原创粉丝点击