Java中有兩個型態系統,基本型態與類別型態,使用基本型態目的在於效率,然而更多時候,會使用類別建立實例,因為物件本身可以攜帶更多資訊,如果要讓基本型態像物件一樣操作,可以使用Long、Integer、Double、Float、Boolean、Byte等類別來包裹(Wrap)基本型態。
Long、Integer、Double、Float、Boolean等類別是所謂的包裹器(Wrapper),正如此名稱所示,這些類別主要目的,就是提供物件實例作為「殼」,將基本型態包裹在物件之中,如此就可以操作這個物件,就像是將基本型態當作物件操作。
基本型態包裹器都是歸類於java.lang套件中,如果要使用Integer包裹int型態資料,方法之一是用new建構Integer實例時,傳入int型態資料。型態轉換 中提過,如果運算式中都是int,就只會在int空間中作運算,結果會是int整數,因此data1 / 3就會顯示3的結果。你可以操作Integer的doubleValue()將包裹值以double型態傳回,如此就會在double空間中作相除,結果就會顯示3.33333333333...。
Integer提供compareTo()方法,可與另一個Integer物件進行比較,如果包裹值相同就傳回0,小於compareTo()傳入物件包裹值就傳回-1,否則就是1,與==或!=只能比較是否相等或不相等,compareTo()方法傳回更多資訊。
除了使用new建構基本型態包裹器之外,從J2SE 5.0之後提供了自動裝箱(Auto boxing)功能,編譯器會自動判斷是否能進行自動裝箱,在上例中你的number會參考Integer實例;同樣的動作可適用於boolean、byte、short、char、long、float、double等基本型態,分別會使用對應的Boolean、Byte、Short、Character、Integer、Long、Float或Double包裹基本型態。
J2SE 5.0後可以自動裝箱,也可以自動拆箱(Auto unboxing),也就是自動取出包裹器中的基本形態資訊。wrapper會參考至Integer,若被指定給int型的變數foo,則會自動取得包裹的int型態再指定給foo。