有时,需要将 int 这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。例如,Integer 类对应基本类型 int。通常,这些类被称为包装器(wrapper)。这些对象包装器类拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character、Void 和 Boolean(前 6 个类派生于公共的父类 Number)。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器类还是 final,因此不能定义它们的子类。
有一个很有用的特性,从而更加便于添加 int 类型的元素到 ArrayList 中。下面这个调用 list.add(3); 将自动地变换成 list.add(Integer.valueOf(3));。这种变换被称为自动装箱(autoboxing)。
相反地,当将一个 Integer 对象赋给一个 int 类型的变量时,将会自动地拆箱。也就是说,编译器将下列语句:int n = list.get(i); 翻译成 int n = list.get(i).intValue();。
最后强调一下,装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。
参考资料
《Java核心技术卷一:基础知识》(第10版)第 5 章:继承 5.4 对象包装器与自动装箱