1. 程式人生 > >Java——包裝類

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);

這裡推薦第二種,因為第二種方法不會產生垃圾空間.