JAVA並非純面向對象的語言。Java語言是一個面向對象的語言,可是Java中的基本數據類型倒是不面向對象的。可是咱們在實際使用中常常須要將基本數據轉化成對象,便於操做。好比:集合的操做中。例如使用Map對象要操做put()方法時,須要傳入的參數是對象而不是基本數據類型。java
爲了解決這個不足,在設計類時爲每一個基本數據類型設計了一個對應的類進行表明,這樣八個和基本數據類型對應的類統稱爲包裝類(Wrapper Class)。緩存
包裝類均位於java.lang包,包裝類和基本數據類型的對應關係以下表所示:app
在這八個類名中,除了Integer和Character類之後,其它六個類的類名和基本數據類型一直,只是類名的第一個字母大寫便可。源碼分析
做爲和基本數據類型對應的類的類型存在,方便涉及到對象的操做。測試
包含每種基本數據類型的相關屬性如最大值、最小值等,以及相關的操做方法(這些操做方法的做用是在基本類型數據、包裝類對象、字符串之間提供轉化!)。spa
全部的包裝類(Wrapper Class)都有共同的方法,他們是:設計
/** * 測試Integer的用法,其餘包裝類相似 */ package com.test063; public class Test063 { public static void main(String[] args){ //基本類型轉換成爲Integer類型 Integer int1 = new Integer(10); Integer int2 = Integer.valueOf(10); //Integer對象轉換成int類型 int int3 = int1.intValue(); //字符串轉化成Integer對象 Integer int4 = new Integer("234"); //Integer對象轉換爲字符串 String str1 = int2.toString(); //一些常見的int類型相關的常量 System.out.println("int能表示的最大整數:"+ Integer.MAX_VALUE);//正2的31次方 System.out.println("int能表示的最小整數:"+ Integer.MIN_VALUE);//負2的31次方 //數值轉換位字符串 String str = 234 +""; System.out.println(str); } }
就是編譯器將基本類型和包裝類進行自動的互相轉換。JDK5.0後,將自動裝箱/拆箱引入java中。
code
自動裝箱的過程:每當須要一種類型的對象時,這種基本類型就自動地封裝到與它相同類型的包裝中。對象
自動拆箱的過程:每當須要一個值時,被裝箱對象中的值就被自動地提取出來,不必再去調用intValue()和doubleValue()方法。rem
自動裝箱與拆箱的功能事實上是編譯器來幫您的忙,編譯器在編譯時期依您所編寫的語法,決定是否進行裝箱或拆箱動做。例如:
Integer i = 100; // 至關於編譯器自動爲您做如下的語法編譯: Integer i = new Integer(100);
自動裝箱與拆箱的功能是所謂的「編譯器蜜糖」(Compiler Sugar),雖然使用這個功能很方便,但在程序運行階段您得了解Java的語義。例以下面的程序是能夠經過編譯的:
Integer i = null; int j = i; //這樣的語法在編譯時期是合法的,可是在運行時期會有錯誤,由於這種寫法至關於: Integer i = null; int j = i.intValue();
null表示i沒有參考至任何的對象實體,它能夠合法地指定給對象參考名稱。因爲實際上i並無參考至任何的對象,因此也就不可能操做intValue()方法,這樣上面的寫法在運行時會出現NullPointerException錯誤。
/** * 測試自動裝箱和拆箱 * 結論:雖然很方便,可是若是不熟悉特殊狀況,可能會出錯! */ static void testBoxing(){ Integer b = 23; //自動裝箱 int a = new Integer(20); //自動拆箱 //自動裝箱和拆箱,其實是編譯器替咱們完成了代碼的自動編譯,好比:Integer b = 23, 其實運行時執行的仍然是:Integer b = new Integer(23); //自動裝箱拆箱時,對於-128-127之間的值,編譯器仍然會把它當作基本類型處理。 Integer h = 100; Integer u = 100; Integer h2 = 200; Integer u2 = 200; if(h==u){ System.out.println("100等於"); } if(h2==u2){ System.out.println("200等於"); } }
//注意一個自動拆裝箱的範圍,在[-128,127]這個區間,編譯器仍然將數值做爲基本類型,而非一個對象,這是爲了提升效率。 Integer d1 = 1234;//等同於Integer d1 = new Integer(1234); Integer d2 = 1234;//等同於Integer d2 = new Integer(1234); System.out.println(d1==d2); // false System.out.println(d1.equals(d2)); // true Integer d3 = 123; Integer d4 = 123; System.out.println(d3==d4);// true 作字符運算時,依然看成基本數據類型處理 System.out.println(d3.equals(d4));// true
package com.test064; public class Test064 { public static void main(String[] args){ Integer i1 = new Integer(2); Integer i2 = 2;//JDK5.0後,編譯器幫咱們改進代碼,至關於Integer i2 = new Integer(2); Integer i3 = 2000; int c1 = i3;//自動拆箱,編譯器幫咱們改進:i3.intValue(); System.out.println(c1); } }