自动装箱/自动拆箱通常发生在与对象相关联的转换过程中.他们也可以应用于表达式.在表达式中,数值对象被自动拆箱,表达式的结果必要时被重新装箱.考虑下面的程序:
public class test2 { // @param args public static void main(String args[]) { Integer iOb,iOb2; int i; iOb = 99; System.out.println("Original value of iOb: "+iOb); ++iOb; System.out.println("After ++iOb:"+iOb); iOb += 10; System.out.println("After iOb += 10 :"+iOb); iOb2 = iOb + (iOb / 3); System.out.println("iOb2 after expression: "+iOb2); i = iOb + (iOb / 3); System.out.println("i after expression : "+i); } }
程序输出如下所示:
Original value of iOb: 99 After ++iOb:100 After iOb += 10 :110 iOb2 after expression: 146 i after expression : 146
在该程序中,要特别关注下面的语句:
++iOb;
该语句递增iOb的值,其工作原理为:拆箱iOb,递增其值,重新装箱结果.
由于有了自动拆箱,就可以使用整型数值对象(如Integer)来控制switch语句.例如,考虑下面的代码段:
switch(iOb) { case 1: System.out.println("one"); case 2: System.out.println("two"); default: System.out.println("error"); }
在计算switch表达式时,拆箱iOb获得其int值.
正如程序中的示例所示,由于有了自动装箱/自动拆箱,在表达式中使用数值对象即直观又容易.在Java以前的版本中,上述代码则需要进行强制类型转换并调用一些诸如intValue()的方法.
一点警告:
Java提供了自动装箱/自动拆箱功能后,程序员可能只想使用Integer或Double等对象,而完全抛弃基本类型.例如,使用自动装箱/自动拆箱可以编写下面的代码:
//A bad use of autoboxing/autounboxing Double a,b,c; Double avg = (a + b + c) / 3;
本例中,Double类型的对象保存值,然后求平均值,并且把结果赋值给另一个Double对象.尽管上述代码从技术上讲是正确的,并且确实可以工作,但是却没有很好的应用自动装箱/自动拆箱.他比使用基本类型double的相应代码的效率低很多.原因在于每一次装箱和拆箱都增加了使用基本类型所没有的开销.
一般来说,应该严格限制类型封装器的使用,只在需要基本类型的对象表示时才使用.自动装箱/自动拆箱并不是做为取消基本类型的”后门”添加到Java中的.