目錄
Java 中的基本型別
理論上來說,真正的物件導向語言中的型別應該都必須是類別定義,像是 Java 中的 Short
、Integer
等類別。不過為了我們使用上的方便,Java 提供了基本型別。在 Java 中,有八種基本型別,分別是 byte
、short
、int
、long
、float
、double
、char
和 boolean
。
同時存在這兩種型別常常會造成我們在設計上要加上許多額外的程式碼,例如在做數字運算時,使用 int
或 double
型別來處理,但是要將數字存入容器時,必須要將其轉換成 Integer
或 Double
型別,才能使用 add(new Integer(i))
,在使用容器或多型處理時常常要多一道轉型手續。
Autoboxing 簡介
Java 1.5 中,已經增加了這方面的處理,稱之為 Autoboxing 和 Unboxing,編譯器會自動幫我們在 int
和 Integer
之中轉換。將 int
包裝成 Integer
稱之為 autoboxing,反之則是 unboxing。底下是一個和泛型一起使用的例子:
import java.util.List;
import java.util.Vector;
public class Autoboxing1 {
public static void main(String[] args) {
List<Integer> list = new Vector<Integer>();
for (int i = 0; i < 6; i++) {
list.add(i); // auto-boxing
}
for (int i = 0; i < 6; i++) {
System.out.print(list.get(i) * 100); // unboxing
System.out.print("-");
}
}
}
輸出結果:
0-100-200-300-400-500-
另一個將 Autoboxing 和泛型 Map
一起使用的例子:
import java.util.HashMap;
import java.util.Map;
public class Autoboxing2 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
for (int i = 0; i < 4; i++) {
map.put(i, "number" + i);
}
System.out.println(map.get(2));
}
}
布林值的 Autoboxing
Autoboxing 主要是在做基本型別和延伸型別之間的轉換,因此針對布林值 boolean
也同樣適用:
import java.util.*;
public class Autoboxing3 {
public static void main(String[] args) {
Boolean bObj = true;
boolean b = false;
if (bObj) {
System.out.println(!bObj);
System.out.println(bObj.getClass().getName());
System.out.println(bObj.equals(b));
//System.out.println(b.equals(bObj)); // 無法通過編譯
}
System.out.println(bObj && b);
}
}
輸出結果:
false java.lang.Boolean false false
值得注意的是,除了傳入值和傳回值會轉換外,在 if
敘述句中原本需要 boolean
運算式判斷的部份,也會自動轉換,以及 !bObj
也會。這和上例中拿 Integer
物件去做四則運算是類似的,可將運算子直接使用在在物件上,像是算術(+ - * / %
)、遞增遞減(++ --
)、比較(>= ==
)、邏輯(&& || !
)、指定(=
)、算術指定(+=
)、位元邏輯(& | ~ ^
)、位移(>>
)、位移指定(>>=
)等運算子都可以用。不過這對物件存取運算子(.
)來說會出現問題,上例的 b.equals(bObj)
就會無法編譯。
浮點數的 Autoboxing
浮點數的部份和上述一樣,可直接轉換。底下是和靜態載入(static import
)一起合用的例子:
import static java.lang.Math.*;
public class Autoboxing4 {
public static void main(String[] args) {
double d = 2.5;
Double dObj = 3.6;
System.out.println(min(d, dObj));
System.out.println(pow(d, dObj));
System.out.println(PI * d * dObj);
}
}
輸出結果:
2.5
27.07597043574791
28.274333882308138
- Oracle Java Tutorials – Autoboxing and Unboxing