发生在表达式中的自动装箱/自动拆箱

自动装箱/自动拆箱通常发生在与对象相关联的转换过程中.他们也可以应用于表达式.在表达式中,数值对象被自动拆箱,表达式的结果必要时被重新装箱.考虑下面的程序:
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中的.