在 Java 中,原語及其包裝器的一個功能是自動裝箱/拆箱。讓我們深入研究一下這個概念。正如我們已經了解到的,Java 是一種物件導向的語言。這意味著所有用 Java 編寫的程式都是由物件組成的。基元不是對象。但即便如此,包裝變數也可以被指派一個原始值。這個過程稱為自動裝箱。類似地,可以為原始變數分配一個包裝物件。這個過程稱為拆箱。例如:
public class Main {
public static void main(String[] args) {
int x = 7;
Integer y = 111;
x = y; // Unboxing
y = x * 123; // Autoboxing
}
}
在第 5 行中,我們將 y(一個Integer物件)指派給基元x。正如您所看到的,我們不必採取任何額外的步驟:編譯器知道int和Integer本質上是相同的東西。這就是開箱。第 6 行的自動裝箱也發生了類似的情況:原始值 (x * 123) 很容易指派給物件y。這是自動裝箱的範例。這就是該術語包含“自動”一詞的原因:因為您不必執行任何特殊操作即可將基元分配給相應的包裝物件(反之亦然)。這一切都是自動發生的。方便吧?:) 我們看到了使用方法時自動裝箱/拆箱的便利性的另一個例子。這是因為方法參數也會自動裝箱和取消裝箱。例如,如果一個方法接受兩個Integer物件作為輸入,我們可以輕鬆地傳遞普通int!
public class Main {
public static void main(String[] args) {
printNumber(7);// A standard int, not even an int variable
}
public static void printNumber(Integer i) {
System.out.println("You entered the number " + i);
}
}
輸出:
You entered the number 7
反之亦然:
public class Main {
public static void main(String[] args) {
printNumber(new Integer(632));
}
public static void printNumber(int i) {
System.out.println("You entered the number " + i);
}
}
您需要記住的重要一點是:自動裝箱和拆箱不適用於陣列!
public class Main {
public static void main(String[] args) {
int[] i = {1,2,3,4,5};
printArray(i);// Error, this won't compile!
}
public static void printArray(Integer[] arr) {
System.out.println(Arrays.toString(arr));
}
}
嘗試將基元數組傳遞給採用物件數組的方法將導致編譯錯誤。總之,讓我們再簡單比較一下原語和包裝器。
原語:
- 具有性能優勢
- 讓我們不要違反「一切皆對象」的原則,這意味著數字、字元和布林值都不會違反這個概念
- 透過提供方便的方法和字段,擴大使用這些值的可能性
- 當方法僅適用於物件時是必需的