術語 autoboxing 是指創建一個代表一個原始類型數據的對象
術語 unboxing 是指創建一個代表一個對象的值的原始類型數據
Java
中新的 autoboxing/unboxing 特性允許我們傳遞原始類型參數給那些期望包裝對象的方法
同樣地
也允許我們傳遞對象給那些期望原始類型參數的方法
例如
假設我們有一個方法 foo(Interger val)
在 Java
之前
為了傳遞一個一個原始類型值給這個方法
需要通過以下方式來做到
int primitiveVal =
;
foo(Integer
valueOf(
));
現在在 Java
中
可以使用原始類型數據直接調用 foo
而無須創建包裝類 Integer 的實例
如下
foo(primitiveVal);
反之如果我們有一個期望原始類型參數的方法 bar(int val)
一樣有一種簡單的方法處理
下面是老的方法
Integer wrapper = new Integer(
);
bar(wrapper
intValue());
而這裡是新方法
bar(wrapper);
編譯器已經為我們做了輔助工作
如果分析由編譯器為下面這個類創建的代碼
你會發現編譯器使用了在老版本中完全一樣的調用方式
這裡有對 BoxingTip 類運行 javap
c 的輸出結果的摘要
public static void main(java
lang
String[]);
: bipush
: istore_
: iload_
: invokestatic #
; //Method
java/lang/Integer
valueOf:(I)Ljava/lang/Integer;
: invokestatic #
; //Method foo:(Ljava/lang/Integer;)V
: aload_
: invokevirtual #
; //Method java/lang/Integer
intValue:()I
: invokestatic #
; //Method bar:(I)V
: return
在第
行
編譯器調用了 Integer 的靜態方法valueOf() 為 foo() 方法提供需要的值
在第
行
調用了現有 Integer 實例的 intValue() 方法提取 int 值傳遞給 bar() 方法
我們可以使用編譯器提供的 autoboxing/unboxing 特性
而無須理解背後究竟發生了什麼
但是知道編譯器為你做了什麼始終都不是一件壞事
在 Java
中這個新特性不僅僅是提供了句法方便
它是進化
而不是革命
但是它是新時期的到來
它將會使編寫 Java 代碼更加容易
public class BoxingTip {
public static void main(String []args) {
Integer wrapper = new Integer(
);
int primitiveValue =
;
foo(primitiveValue);
bar(wrapper);
}
static void foo(Integer val) {
System
out
println( val);
}
static void bar(int val) {
System
out
print(val);
}
}
注意
這個提示中的代碼在 Windows
下使用 Java build
beta
b
c 編譯通過
如果要編譯這段代碼
必須使用 javac
source
選項
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26597.html