CodeGym /Java Blog /Toto sisi /Java 中的自動裝箱與拆箱
John Squirrels
等級 41
San Francisco

Java 中的自動裝箱與拆箱

在 Toto sisi 群組發布
在 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。正如您所看到的,我們不必採取任何額外的步驟:編譯器知道intInteger本質上是相同的東西。這就是開箱。第 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));
   }
}
嘗試將基元數組傳遞給採用物件數組的方法將導致編譯錯誤。總之,讓我們再簡單比較一下原語和包裝器。

原語:

  • 具有性能優勢
包裝紙:
  • 讓我們不要違反「一切皆對象」的原則,這意味著數字、字元和布林值都不會違反這個概念
  • 透過提供方便的方法和字段,擴大使用這些值的可能性
  • 當方法僅適用於物件時是必需的
為了鞏固您所學到的知識,我們建議您觀看我們的 Java 課程中的影片課程
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION