Java中有兩個型態系統,基本型態與類別型態,使用基本型態目的在於效率,然而更多時候,會使用類別建立實例,因為物件本身可以攜帶更多資訊,如果要讓基本型態像物件一樣操作,可以使用Long、Integer、Double、Float、Boolean、Byte
等類別來包裹(Wrap)基本型態。
Long、Integer、Double、Float、Boolean
等類別是所謂的包裹器(Wrapper),正如此名稱所示,這些類別主要目的,就是提供物件實例作為「殼」,將基本型態包裹在物件之中,如此就可以操作這個物件,就像是將基本型態當作物件操作。來看個簡單的例子:
package cc.openhome;
public class IntegerDemo {
public static void main(String[] args) {
int data1 = 10;
int data2 = 20;
Integer wrapper1 = new Integer(data1);
Integer wrapper2 = new Integer(data2);
System.out.println(data1 / 3);
System.out.println(wrapper1.doubleValue() / 3);
System.out.println(wrapper1.compareTo(wrapper2));
}
}
基本型態包裹器都是歸類於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)功能,可以如下包裹基本型態:
Integer number = 10;
編譯器會自動判斷是否能進行自動裝箱,在上例中你的number會參考
Integer
實例;同樣的動作可適用於boolean、byte、short、char、long、float、double
等基本型態,分別會使用對應的Boolean、Byte、Short、Character、Integer、Long、Float或Double
包裹基本型態。若使用自動裝箱功能來改寫一下IntegerDemo
中的程式碼:
Integer data1 = 10;
Integer data2 = 20;
System.out.println(data1.doubleValue() / 3);
System.out.println(data1.compareTo(data2));
程式看來簡潔許多,data1
與data2
在運行時會參考Integer
實例,可以直接進行物件操作。自動裝箱運用的方法還可以如下:
int number = 10;
Integer wrapper = number;
自動拆箱
J2SE 5.0後可以自動裝箱,也可以自動拆箱(Auto unboxing),也就是自動取出包裹器中的基本形態資訊。例如:
Integer wrapper = 10; // 自動裝箱
int foo = wrapper; // 自動拆箱
wrapper
會參考至Integer
,若被指定給int
型的變數foo
,則會自動取得包裹的int
型態再指定給foo
。
在運算時,也可以進行自動裝箱與拆箱,例如:
Integer number = 10;
System.out.println(number + 10);
System.out.println(number++);
上例中會顯示20與10,編譯器會自動自動裝箱與拆箱,也就是10會先裝箱,然後在number + 10
時會先對number
拆箱,再進行加法運算;number++
該行也是先對i拆箱再進行遞增運算。再來看一個例子:
Boolean foo = true;
System.out.println(foo && false);
同樣地,foo
會參考至Boolean
實例,在進行&&
運算時,會先將foo
拆箱,再與false
進行&&
運算,結果會顯示false
。