基本數據(Primitive)類型的自動裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開始提供的功能。雖然為您打包基本數據類型提供了方便,但提供方便的同時表示隱藏了細節,建議在能夠區分基本數據類型與對象的差別時再使用。
autoboxing和unboxing
在Java中,所有要處理的東西幾乎都是對象 (Object),例如之前所使用的Scanner是對象,字符串(String)也是對象,之後還會看到更多的對象。然而基本(Primitive)數據類型不是對象,也就是您使用int、double、boolean等定義的變量,以及您在程序中直接寫下的字面常量。
在前一個小節中已經大致看到了操作對象的方便性,而使用Java有一段時間的人都知道,有時需要將基本數據類型轉換為對象。例如使用Map對象要操作put()方法時,需要傳入的參數是對象而不是基本數據類型。
要使用打包類型(Wrapper Types)才能將基本數據類型包裝為對象,前一個小節中您已經知道在J2SE 5.0之前,要使用以下語句才能將int包裝為一個Integer對象:Integer integer = new Integer(10);
在 J2SE 5.0之後提供了自動裝箱的功能,您可以直接使用以下語句來打包基本數據類型:Integer integer = 10;
在進行編譯時,編譯器再自動根據您寫下的語句,判斷是否進行自動裝箱動作。在上例中integer參考的會是Integer類的實例。同樣的動作可以適用於 boolean、byte、short、char、long、float、double等基本數據類型,分別會使用對應的打包類型(Wrapper Types)Boolean、Byte、Short、Character、Long、Float或Double。下面直接使用自動裝箱功能來改寫范例 4.4。
范例4.5 AutoBoxDemo.java
public class AutoBoxDemo {
public static void main(String[] args) {
Integer data1 = 10;
Integer data2 = 20;
// 轉為double值再除以3
system.out.println(data1.doubleValue() / 3);
// 進行兩個值的比較
system.out.println(data1.compareTo(data2));
}
}
程序看來簡潔了許多,data1與data2在運行時就是Integer的實例,可以直接進行對象操作。執行的結果如下:
3.3333333333333335
–1
自動裝箱運用的方法還可以如下:
int i = 10;
Integer integer = i;
也可以使用更一般化的java.lang.Number類來自動裝箱。例如:
Number number = 3.14f;
3.14f會先被自動裝箱為Float,然後指定給number。
從J2SE 5.0開始可以自動裝箱,也可以自動拆箱(unboxing),也就是將對象中的基本數據形態信息從對象中自動取出。例如下面這樣寫是可以的:
Integer fooInteger = 10;
int fooPrimitive = fooInteger;
fooInteger引用至自動裝箱為Integer的實例後,如果被指定給一個int類型的變量fooPrimitive,則會自動變為int類型再指定給fooPrimitive。在運算時,也可以進行自動裝箱與拆箱。例如:
Integer i = 10;
System.out.println(i + 10);
System.out.println(i++);
上例中會顯示20與10,編譯器會自動進行自動裝箱與拆箱,也就是10會先被裝箱,然後在i + 10時會先拆箱,進行加法運算;i++該行也是先拆箱再進行遞增運算。再來看一個例子:
Boolean boo = true;
System.out.println(boo && false);
同樣的boo原來是Boolean的實例,在進行AND運算時,會先將boo拆箱,再與false進行AND運算,結果會顯示false。