14.java 基本資料型別的包裝類
概念
java在設計之初,有一個基本原則:一切皆物件。但是基本資料型別不是物件,不具備“物件”的特性——不攜帶屬性、沒有方法可呼叫。為了解決此類問題,Java為每種基本資料型別分別設計了對應的類,稱之為包裝類(Wrapper Classes).
基本資料型別及對應的包裝類
基本資料型別 | 對應的包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
每個包裝類的物件可以封裝一個相應的基本型別的資料,並提供了其它一些有用的方法。包裝類物件一經建立,其內容(所封裝的基本型別資料值)不可改變.
包裝類雖然都是object的子類,但嚴格來說又可分為兩種:
- 物件包裝類(object直接子類):Character、Boolean
- 數值包裝類(Number直接子類):Byte、Short、Integer、Long、Float、Double
Number繼承了Object類,是一個抽象類。裡面定義了六個抽象方法:byteValue()、shortValue()、intValue()、longValue()、floatValue()、doubleValue()。
資料的裝箱與拆箱
基本型別和對應的包裝類可以相互裝換:
- 由基本型別向對應的包裝類轉換稱為裝箱 ,例如把 int 包裝成 Integer 類的物件;
- 包裝類向對應的基本型別轉換稱為拆箱 ,例如把 Integer 類的物件重新簡化為 int;
示例:
public class testDemo { public static void main(String[] args) { int m = 500; Integer obj = new Integer(m); // 手動裝箱 int n = obj.intValue(); // 手動拆箱 System.out.println("n = " + n); Integer obj1 = new Integer(500); System.out.println("obj 等價於 obj1?" + obj.equals(obj1)); } } 輸出結果: n = 500 obj 等價於 obj1?true
自動拆箱和裝箱
上面的例子都需要手動例項化一個包裝類,稱為手動拆箱、裝箱。Java 1.5 之前必須手動拆箱裝箱。
Java 1.5 之後可以自動拆箱裝箱,也就是在進行基本資料型別和對應的包裝類轉換時,系統將自動進行,並且可以直接利用包裝類進行數學計算。
示例:
public class testDemo { public static void main(String[] args) { Integer obj = 10; // 自動裝箱 int n = obj; // 自動拆箱 System.out.println("n = " + n); System.out.println(obj * 2);//包裝類直接進行數學計算。 Integer obj1 = 10; System.out.println("obj 等價於 obj1?" + obj.equals(obj1)); } } 輸出結果: n = 10 20 obj 等價於 obj1?true
由於存在自動裝箱,那麼object可以接收一切資料型別了,包括基本資料型別。
流程:基本資料型別--> 自動裝箱--> 向上轉型為object
但object型別不能直接轉為基本資料型別,要先轉為對應的包裝類,然後自動拆箱。
手動裝箱與自動裝箱的區別
手動裝箱與自動裝箱與String兩種例項化方式的區別是一樣的。
自動裝箱(即直接賦值)將會比使用構造方法的方式節省一塊堆記憶體空間,並自動入物件池。而手動裝箱(使用構造方法)會產生兩塊堆記憶體,而且不會儲存在物件池中。
但是和String不同的是包裝物件沒有intern()方法,無法手動入池。
示例:
public class testDemo { public static void main(String[] args) { Integer obja = 10;//直接賦值,自動裝箱 Integer objb = 10; //直接賦值,自動裝箱 Integer objc = new Integer(10); //手動裝箱 System.out.println(obja == objb); System.out.println(obja == objc); System.out.println(objb == objc); System.out.println(obja.equals(objc)); } } 輸出結果: true false false true
資料型別的轉換
包裝類提供了基本資料型別和String型別相互轉換的功能。
將 String 轉為基本資料型別
Integer類: public static int parseInt(String s) Double類: public static double parseDouble(String s) Boolean類: public static boolean parseBoolean(String s) .....
需要注意的是Character 類裡面並不存在將字串變為字元的方法,因為String類有一個charAt()的方法,可以根據索引取出字元。
基本資料型別轉為String
有兩種方式:
- 任何基本資料型別與字串使用了"+"操作之後都將轉為String型別。
- 在String類中定義有valueOf()方法,該方法可以接收所有的基本資料型別。