1. 程式人生 > 其它 >10,異常機制

10,異常機制

包裝類

為什麼要用包裝類?

1.某些方法的引數必須是物件,為了讓基本資料型別的資料能作為引數,提供了包裝類

2.包裝類提供了很多功能,如:獲取基本類型範圍的最大值,位元組數的方法

3.可以實現字串和基本資料型別間的轉換

程式碼示例:

public  class Demo01 {
    public static void main(String[] args) {
        String a="10";
        int i = Integer.parseInt(a);//將字串轉換為基本資料型別中的int型別
        Integer integer = Integer.valueOf(a);//將字串轉換為Integer包裝類
        double  v= Double.parseDouble(a);//將字串轉換為基本資料型別中的double型別
        Double aDouble = Double.valueOf(a);//將字串轉換為Double包裝類
        System.out.println("i="+i);
        System.out.println("Integer="+integer);
        System.out.println("v="+v);
        System.out.println("Double="+aDouble);
    }
}
執行結果:
i=10
Integer=10
v=10.0
Double=10.0

自動裝箱、拆箱

public class Demo02 {
    public static void main(String[] args) {
        int i = 10;
        Integer ii = new Integer(i);//手動將基本資料型別轉換為包裝類
        int c = ii.intValue();//手動將包裝類轉換為基本資料型別

        //jdk1.5以後:自動裝箱(基本資料型別-->包裝類)
        Integer a=i;//底層使用Integer.valueOf()完成自動裝箱,Integer.valueOf()其實也是通過new Integer()實現的

        //jdk1.5以後:自動拆箱(包裝類-->基本資料型別)
        int b=a;//底層使用intValue()完成自動拆箱
    }

}

注意

1.jdk1.5之後,增加了自動裝箱,自動拆箱功能

2.自動裝箱時呼叫的valueOf()方法,valueOf()底層其實調的還是new Integer()方法

3.自動拆箱調的xxxVaule()方法

4.包裝類在自動裝箱時為了提高效率,對於-128~127之間的值進行了快取處理。超過範圍後,物件之間不能在使用==進行數值的比較,而是使用equals方法

valueOf原始碼:
public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);//超出-128~127範圍的會建立物件
    }

程式碼示例

public class Demo03 {
    public static void main(String[] args) {
        int a=10;
        Integer b=10;
        //==比較的地址,equals比較的值
        System.out.println(a==b);// true            + - * / == 型別不一樣時,會自動拆箱
        System.out.println(b.equals(a));//true
        Integer aa=new Integer(10);
        Integer bb=new Integer(10);
        System.out.println(aa==bb);//false,地址不同
        System.out.println(aa.equals(bb));//true
        Integer aaa=125;
        Integer bbb=125;
        System.out.println(aaa==bbb);//true,快取中取
        System.out.println(aaa.equals(bbb));//true
        Integer aaaa=130;
        Integer bbbb=130;
        System.out.println(aaaa==bbbb);//false,地址不同
        System.out.println(aaaa.equals(bbbb));//true
    }
}