除了赋值这种简单情况之外,自动装箱在基本类型必须转换为对象时会自动发生,自动拆箱在对象必须转换为基本类型时自动发生.也就是说,当实参传递给方法,或者从方法返回值时可能发生自动装箱和自动拆箱.考虑下面的程序:
public class test2 { // @param args public static void main(String args[]) { AutoBox2.m(199); Integer iOb = AutoBox2.m2(); System.out.println("return value from m2() is "+iOb); int i = AutoBox2.m3(); System.out.println("return value from m3() is "+i); } iOb = 100; System.out.println("Square root of iOb is "+Math.sqrt(iOb)); } class AutoBox2 { static void m(Integer v) { System.out.println("m() received "+ v); } static int m2() { return 10; } static Integer m3() { return 99; } }
该程序显示下面的结果:
m() received 199 return value from m2() is 10 return value from m3() is 99 Square root of iOb is 10.0
注意在该程序中,m()指定了一个Integer形参.在main()中,传递给m()方法的int值为199.由于m()接受Integer形参,该值将自动装箱.接下来调用m2(),他返回int值10.该值被赋给main()中的iOb.由于iOb是Integer,m2()返回的值被自动装箱.接下来调用m3(),他返回一个自动拆箱为int的Integer.最后,以Iob为实参调用Math.sqrt().这时,iOb被自动拆箱,其值会升级为double,因为这是Math.sqrt()所需的类型.