Java 1.5 特性 : Autoboxing

Java 中的基本型別

理論上來說,真正的物件導向語言中的型別應該都必須是類別定義,像是 Java 中的 ShortInteger 等類別。不過為了我們使用上的方便,Java 提供了基本型別。在 Java 中,有八種基本型別,分別是 byteshortintlongfloatdoublecharboolean

同時存在這兩種型別常常會造成我們在設計上要加上許多額外的程式碼,例如在做數字運算時,使用 intdouble 型別來處理,但是要將數字存入容器時,必須要將其轉換成 IntegerDouble 型別,才能使用 add(new Integer(i)),在使用容器或多型處理時常常要多一道轉型手續。

Autoboxing 簡介

Java 1.5 中,已經增加了這方面的處理,稱之為 AutoboxingUnboxing,編譯器會自動幫我們在 intInteger 之中轉換。將 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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

17 − twelve =

返回頂端