Steve
Lv 6
Steve asked in 電腦與網際網路程式設計 · 1 decade ago

有關JAVA中boxing.unboxing.auto

請問一下java中的boxing、unboxing、autoboxing

是什麼意思呢?

有什麼例子能讓我了解一下嗎?

2 Answers

Rating
  • 酷兒
    Lv 5
    1 decade ago
    Favorite Answer

    Boxing/unBoxing 是一種將基本資料型態(例如: int, string, double...)轉成物件的一種機制

    在 MSDN 上有說明 Boxing 和 unboxing 的觀念, 我想 .NET 和 java 在觀念上應該是一致的提供你參考

    http://msdn.microsoft.com/zh-tw/library/yz2be5wk(V...

    http://msdn.microsoft.com/zh-tw/library/b95fkada(V...

    http://caterpillar.onlyfun.net/Gossip/JavaGossip-V...

    Boxing 可用來儲存記憶體回收堆積((Heap)中的實值型別(Value Type)。Boxing 是一種隱含轉換,可將實值型別轉換成 object 型別或任何由這個實值型別實作的介面型別。對實值型別進行 Boxing 作業時,會在堆積上配置物件執行個體,並將值複製至新物件中。

    Unboxing 處理是將 object 型別明確轉換成實值型別,或從介面型別明確轉換成實作介面的實值型別。Unboxing 作業包含:

    1.檢查物件執行個體以確定這是指定之實值型別的 boxed 值

    2.將執行個體的值複製到實值型別變數

    實例:

    int i= 100;

    Object a = i; //auto boxing 編譯器自動將 i Boxing 成Integer物件

    Object b = (Integer)i; //boxing 將 i Boxing 成 Integer物件

    Object c = (double)i; //boxing 將 i Boxing 成 double 物件

    int j= (Integer)a; //unboxing 將 物件a unboxing 成 Integer

    System.out.println(a.getClass()); //輸出class java.lang.Integer

    System.out.println(b.getClass()); //輸出class java.lang.Integer

    System.out.println(c.getClass()); //輸出class java.lang.Double

    如果有解釋不對的地方, 請高手們指正

    Source(s): MSDN
  • 爵士
    Lv 5
    1 decade ago

    在Java中,所有您要處理的東西「幾乎」都是物件(Object),例如您之前所使用的Scanner是物件,字串(String)是物件,您之後還會看到更多的物件。

    然而有些是例外,基本(Primitive)資料型態不是物件,也就是您使用int、double、boolean等宣告的變數,以及您在程式中直接寫下的字面常量。

    使用Java有一段時間的人都知道,有些時候您需要將基本型態轉換為物件,例如使用Map時,要使用put()方法時需要的是物件而不是基本型態。

    您要使用包裹型態(Wrapper Types)才能將基本資料型態包裝為物件,例如在 J2SE 1.4.2 之前,您要如下才能將int包裝為一個Integer物件:

    Integer integer = new Integer(10);

    在 J2SE 5.0 之後您可以這麼寫:

    Integer integer = 10;

    事實上編譯器在背後自動根據您寫下的陳述,為您進行自動裝箱(Autoboxing)動作,同樣的動作可以適用於 boolean、byte、short、char、long、float、double等基本型態,分別會使用對應的包裹型態(Wrapper Types)Boolean、Byte、Short、Character、Integer、Long、Float或Double。

    自動裝箱運用的方法還可以如下:

    int i = 10;

    Integer integer = i;

    您也可以使用更一般化的Number,例如:

    Number number = 3.14f;

    3.14f會先被自動裝箱為Float,然後指定給number。

    J2SE 5.0中可以自動裝箱,也可以自動拆箱(Unboxing),例如下面這樣寫是可以的:

    Integer fooInteger = 10;

    int fooPrimitive = fooInteger;

    在運算時,也可以自動裝箱與拆箱,例如:

    Integer i = 10;

    System.out.println(i + 10);

    System.out.println(i++);

    上例中會顯示20與10,編譯器會自動幫您進行自動裝箱與拆箱,即10會先被裝箱,然後在i + 10時會先拆箱,進行加法運算;i++該行也是先拆箱再進行遞增運算。再來看一個例子:

    Boolean boo = true;

    System.out.println(boo && false);

    同樣的,先將boo拆箱,再與false進行AND運算,結果會顯示false。

    良格葛網站

Still have questions? Get your answers by asking now.