我們知道,java提供的8種基本數據類型并不支持面向對象的編程機制,不具備“對象“的特性,沒有成員變量、方法可以被調用。java之所以提供這8種基本數據類型,主要是為了照顧程序員的傳統習慣。
這8種基本數據類型帶來了一定的方便性,例如簡單的數據運算和常規數據的處理。但是在某些時候,基本數據類型也會有一些制約,例如所有的引用類型的變量都繼承了Object類,都可以當成Object類型變量使用。但基本數據類型的變量不可以,如果有方法需要Object類型的參數,但實際需要的值是1、2、3等數值,這可能就比較難以處理。
為了解決8中基本數據類型變量不能當成Object類型變量使用的問題,java提供了包裝類的思想,為8種基本數據類型分別定義了相應的引用類型,并稱之為基本數據類型的包裝類。
基本數據類型和包裝類的對應表
byte | short | int | long | float | double | char | boolean |
Byte | Short | Integer | Long | Float | Double | Character | Boolean |
class BaoZhuang{ publicstatic void main(String[] args){ int i= 123; Integerinteger = new Integer(i); System.out.PRintln(integer); byte b= 123; Bytebb = new Byte(b); System.out.println(bb); shorts = 123; Shortss = new Short(s); System.out.println(ss); long l= 123; Longll = new Long(l); System.out.println(ll); floatf = 123.0f; Floatff = new Float(f); System.out.println(ff); doubled = 123.0; Doubledd = new Double(d); System.out.println(dd); char c= 'c'; Charactercharacter = new Character(c); System.out.println(character); booleanbl = true; Booleanboo = new Boolean(bl); System.out.println(boo); }}
除了int和char之外,其他的基本數據類型只需要首字母大寫即可編程它們對應的包裝類。
自動裝箱和自動拆箱:
我們都知道,不可以直接把基本數據類型賦值給引用數據類型。所以在JDK1.5之前,構建一個包裝類需要通過構造器來構造包裝類對象,但是這顯得代碼過于麻煩,所以從1.5之后就提供了自動裝箱和自動拆箱的功能。
自動裝箱:就是可以把一個基本類型變量直接賦值給對應的包裝類變量,或者賦值給Object變量(因為Object類是所有類的父類);
int i= 123; Integerinteger = i;//JDK1.5之前:new Integer(i); //先把123456自動裝箱為Integer類型,Object代表Integer Objectobj = 123456; System.out.println(obj);//打印結果123456
自動拆箱:與自動裝箱相反,允許直接把包裝類對象直接賦值給一個對應的基本類型變量。
//TODO代碼演示自動裝箱與自動拆箱
//自動裝箱 Integerinteger = 1234; //自動拆箱 intint2 = integer; System.out.println(int2); int i= 123; Objectobj = i; int ii= (Integer)obj; System.out.println(ii);
思考:
Byteb = 123; //b自動轉換成了byte,byte強轉int Integerinteger = (int)b; System.out.println(integer);當JDK提供了自動裝箱和自動拆箱功能后,大大簡化了基本類型變量和包裝類對象之間的轉換,值得提出的是,進行自動裝箱和自動拆箱時,必須注意類型匹配,例如Integer只能自動拆箱成int類型變量,不要試圖拆箱成boolean類型變量;與之類似的是,int類型只能自動裝箱成Integer對象,即便賦給Object類型變量,那也是利用了自動轉型的特性,不要試圖將int自動裝箱成Boolean類型對象。
借助這種機制,一定程度上,我們可以把包裝類當成基本數據類型使用,也可以把基本類型的變量近似的當成對象使用(當然,使用的時候需要自動裝箱一下)。
除此之外,包裝類還可以實現基本類型變量和字符串之間的轉換,把字符串類型的值轉換為基本類型的值有兩種方式。
1、parseXxx(String )靜態方法。(Character除外)
2、利用包裝類提供的Xxx(Stirng s)構造器。
class BaoZhuang{ publicstatic void main(String[] args){ //字符串和基本數據類型可以轉換了 //1 靜態方法調用 intresult = Integer.parseInt("123"); System.out.println(result); //2 構造方法創建 result= new Integer("1234"); System.out.println(result); }} String類型也提供了多個重載的valueOf()方法,用于將基本類型變量轉換成字符串,下面程序示范 了這種轉換關系。
//TODO 字符串與包裝類的互轉 Stringstr2 = String.valueOf(i); System.out.println(str2); //但是實際中,我們有更加簡便的方法將數據類型轉為String int i= 123; Stringstr = i + ""; 當包裝類型的變量是引用數據類型,但是我們也可以拿這些包裝類型對象與數值類型的值比較,這種比較是直接取出包裝類的實例所包裝的數值再與之進行比較。
//TODO Integerinteger = 123; System.out.println(integer> 456); Integerinteger1 = 1234; Integerinteger2 = 456; System.out.println(integer1> integer2);但是,如果是兩個包裝類型直接比較,即便包裝的值相同,但是也會返回false,因為引用數據類型比較是有其他方式比較的,以后會說引用數據類型的比較。
//TODO Integerinteger1 = 456; Integerinteger2 = 456; System.out.println(integer1== integer2);//false//練習包裝類方法、靜態方法、構造器、常量
//字符串數字解碼接受不同進制格式的字符串數字 intresult = Integer.decode("0x123456"); System.out.println(result); //字符串解碼,僅支持字面量數字 result= new Integer("12345"); System.out.println(result);
新聞熱點
疑難解答