Java——包裝類
包裝類
就是將基本資料型別封裝到類中。
包裝類的產生原因:Object類可以接收所有引用資料型別。然而在Java中,資料型別分為基本資料型別和引用資料型別,為了使用Object接收一切東西,引出了包裝類.
自己定義一個包裝類
public class Test { public static void main(String[] args) { Object obj = new IntDemo(10);//向上轉型 fun(obj); } public static void fun(Object obj){ IntDemo temp = (IntDemo) obj;//向下轉型 System.out.println(temp.intValue()); } } class IntDemo{ private int num; public IntDemo(int num){ this.num = num; } public int intValue(){ return this.num; } }
通過包裝類可以看出基本資料型別也可以像引用型別一樣使用Object接收.這個時候的IntDemo實際上就是int資料型別的包裝類,利用IntValue()就可以實現基本資料型別變為物件的需求。
Java中有8種資料型別,如果每種資料型別都按照以上方式編寫,存在以下問題:
1. 開發中程式碼重複
2. 在進行數學計算的時候,必須利用明確的方法將包裝的資料取出後才可以進行運算。
所以Java為了方便開發,專門提供了包裝類的使用,而對於包裝類的使用,提供了兩種型別。
- 物件型(Object的直接子類):Boolean、Character(char);
- 數值型(Number的直接子類):Byte、Double、Short、Long、Integer(int)、Float;
裝箱與拆箱
在包裝類與基本資料型別處理之中存在有兩個概念:
裝箱:將基本資料型別變為包裝類物件。利用每個包裝類提供的構造方法實現
拆箱:將包裝類中包裝的基本資料型別取出,利用xxValue();方法
Integer num = new Integer(10);//裝箱
int data = num.intValue();//拆箱
以上操作採用的是手工的裝箱和拆箱。在JDK1.5之後,提供了自動拆裝箱的機制,最為重要的是,由於此類機制的
存在,可以直接利用包裝類的物件進行各種數學計算。
Integer num = 10; System.out.println(num + 10);
這個時候依然存在有"==" 和 "equals" 問題
看一個例子
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);//true
System.out.println(i3 == i4);//false
System.out.println(i3.equals(i4));//true
說明:對於 Integer var = ? 在-128 至 127 範圍內的賦值,Integer 物件是在IntegerCache.cache 產生,會複用已有對
象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有資料,都會在堆上產生,並不會
複用已有物件,這是一個大坑,推薦使用 equals 方法進行判斷。
阿里編碼規範:所有的相同型別的包裝類物件之間值的比較,全部使用 equals 方法比較。
對於什麼時候使用包裝類,什麼時候使用基本資料型別,這裡也給出阿里編碼規範:
1.[強制]:所有POJO類(簡單java類,類中只有成員變數、構造方法、getter/setter)屬性必須使用包裝類
2.[強制]:RPC方法返回值和引數必須使用包裝類
3.[推薦]:所有的區域性變數使用基本型別
包裝類與字串的轉換
以後要進行各種資料的輸入,一定都是字串型別的接收。所以在開發之中,如何將字串變為各個資料型別,這個時候就需要包裝類支援。
1.String變為基本資料型別 包裝類.parseInt(字串)
String str = "123";
int num = Integer.parseInt(str);//將字串轉int
double num2 = Double.parseDouble(str);//將字串轉double
System.out.println(num);
System.out.println(num2);
/**
* 輸出
* 123
* 123.0
*/
注意: 將 字 符 串 轉 為 數 字 的 時 候 , 字 符 串 的 組 成 有 非 數 字 , 那 麼 轉 換 就 會 出 現 錯誤(NumberFormatException),而字串與boolean轉換就不受此影響。
String str = "true";
boolean bool = Boolean.parseBoolean(str);
System.out.println(bool);
字串內容除了true外,其他內容轉成boolean都是false.
將基本資料型別轉成字串有2種方法:
1.使用"+" (str + 基本資料型別 )
2.String類提供的靜態方法 valueOf(基本型別)
int num = 10;
String str = String.valueOf(num);
System.out.println(str);
這裡推薦第二種,因為第二種方法不會產生垃圾空間.