5.4 對象包裝器和自動裝箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)

有時候我們需要把基本數據類型轉換爲對象類型。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 等。每個持有者類型都包含’一個 公有(!)域值,通過它可以訪問存儲在其中的值。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章