有時候我們需要把基本數據類型轉換爲對象類型。java中的
包裝器
解決了這個需求。
什麼是包裝器呢?
包裝器就是基本數據類型對應的java類,比如Integer類是int對應的包裝器;
包裝器:Ingeter、Long、Float、Short、Byte、Character、Void、Boolean
其中Ingeter、Long、Float、Short、Byte、Character的超類類是Number
- 對象包裝器類是不可變的,不可以更改包裝器中包裝的值,這句話的意思可以理解爲Integer類本身(構造器、函數)不可以改變包裝的值,但是可以改變Integer的引用來達到改變值的效果。
- 對象包裝器類是final,因此不能用它們定義子類
什麼是自動裝箱呢?
這裏我們定義一個ArrayList對象:
ArrayList<Integer> list = new ArrayList<Integer>();
執行:list.add(1);
將自動變換成:list.add(Ingeter.valueOf(1));
這種變換稱爲自動裝箱
。
什麼是拆箱?
將一個Ingeter對象賦給int值時,稱爲拆箱
。
int a = list.get(0);
自動拆解爲:int n=list.get(0).intValue();
在算術表達式中也能夠自動的
裝箱
和拆箱
。
例如,可以將自增操作符應用於一個包裝器
引用:
Integer n = 3;
n++;
編譯器將自動地插人一條對象拆箱的指令, 然後進行自增計算, 最後再將結果裝箱。
在比較兩個包裝器對象的值是否一樣時,不要用==,==只不過檢測的是對象是 否指向同一個存儲區域。
兩個包裝器對象比較時調用 equals方法。
由於包裝器類引用可以爲 null, 所以自動裝箱 有可能會拋出一個 NullPointerException 異常:
如果在一個條件表達式中混合使用 Integer 和 Double 類型, Integer 值就會拆箱, 提升爲 double, 再裝箱爲 Double
裝箱和拆箱是編譯器認可的,而不是虛擬機。編譯器在生成類的字節碼 時, 插人必要的方法調用。虛擬機只是執行這些字節碼。
此外對象包裝器中有很多的方法函數:這裏只列舉Ingeter的函數和方法
如果想編寫一個修改數值參數值的方法, 就需要使用在 org.omg.CORBA 包中定義的 持有者( holder) 類型, 包括 IntHolder、BooleanHolder 等。每個持有者類型都包含’一個 公有(!)域值,通過它可以訪問存儲在其中的值。