在java中有基本資料型別和引用型別兩種,今天來說下基本資料型別和其對應的包裝類的之間的關係。
一、概述
java中的基本資料型別有八種,分別是char、byte、short、int、long、float、double,boolean。其中這八種基本型別都有其對應的包裝類,分別是Character、Byte、Short、Integer、Long、Float、Double、Boolean。八種基本資料型別中byte、short、int、long都是表示的整型(無小數位),float、double表示的是浮點數(俗稱小數),char表示的是單個字元,boolean表示的是布林型。
在java中整型預設的基本資料型別為int,浮點型預設為double。
二、詳述
何為包裝類
都知道java種8種資料型別都有其對應的包裝類,那麼何為包裝類,如何去理解包裝類。
所謂包裝類其實很好理解,只要從字面量來理解即可,舉個例子,就是拿一個箱子把水杯包裝起來,這就可以類比包裝類。關鍵要知道包裝類包裝的是什麼東西,是如何包裝的。
下面看Integer類的定義,
/** * The value of the {@code Integer}. * * @serial */ private final int value;
在Integer類中有int型別的value,那麼包裝的便是基本型別int,把value進行了包裝,再看Double類
/** * The value of the Double. * * @serial */ private final double value;
在Double類中同樣有一個Double型別的value,那麼包裝的便是double基本型別。
從上面我們知道了,包裝類包裝的其實就是基本型別,和基本型別的區別是包裝類是一個引用型別,很好的詮釋了java的封裝的特性,把相應的基本型別進行了封裝,並提供了一些共用的操作;
資料長度
八種基本資料型別每個所能表示的資料範圍不同,在其相應的包裝類中都有其最大值和最小值的定義。且通過
byte佔8位,也就是1個位元組,且有符號,以二進位制補碼錶示;因為有符號,所以符號位佔1位,有效的數字位未7位,資料範圍未-128~127,即,-2^7~2^7-1,因為中間有0,所以最大需要減1
short佔16位,也就是2個位元組,且是有符號,以二進位制補碼錶示;因為有符號,所以符號位佔1位,有效的數字位未15位,資料範圍未-2^15~2^15-1;
int佔32位,也就是4個位元組,且是有符號,以二進位制補碼錶示;因為有符號,所以符號位佔1位,有效的數字位未31位,資料範圍未-2^31~2^31-1;
long佔64位,也就是8個位元組,且是有符號,以二進位制補碼錶示;因為有符號,所以符號位佔1位,有效的數字位未63位,資料範圍未-2^63~2^63-1;
float佔32位,也就是4個位元組,無符號,是單精度的;怎麼儲存的?
double佔64位,也就是8個位元組,無符號,是雙精度的;
char是一個單一的 16 位 Unicode 字元;
boolean表示一位的資訊只有true和false;
自動裝箱與拆箱
何為自動裝箱與拆箱,其實這是針對基本資料型別和包裝型別來說的,從基本資料型別到包裝型別是裝箱,從包裝型別到基本資料型別是拆箱,而這個轉變是自動的,無需程式設計師手動轉化,
public void execPackAndUnpack(){ int b=1; //呼叫方法,傳入int型別的數值,自動裝箱位Integer型別 autoPackAndUnpack(b); } public void autoPackAndUnpack(Integer i){ //進行算術加運算,將i自動拆箱為int執行相加操作 int a=i+1; System.out.println(a); }
上面的兩個方法便是很好的自動裝箱和拆箱的例子,那麼java為自動裝箱和拆箱做了哪些事那。
其實自動裝箱,呼叫的是包裝類的靜態方法。以上面的int型別為例,自動裝箱呼叫的Integer.valueOf()方法,而自動拆箱呼叫的Integer.intValue()方法,下面看這兩個方法的定義,
valueOf(int i)
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
從上面可以看到最後返回的是一個Integer的物件,完成了裝箱的功能。
intValue()
public int intValue() { return value; }
可以看到最後返回的是int型別,完成了拆箱。
valueOf方法
在每個包裝類中都有valueOf方法,看下Integer中的valueOf方法
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
看到最後使用i構造了一個Integer物件,再看下Double類中的valueOf方法,
public static Double valueOf(double d) { return new Double(d); }
看到使用d構造了一個Double物件。
很多資料把valueOf方法作為工廠方法來講解,當然這裡也可以這樣理解,就是通過基本型別來構造相應的包裝類。
parseXXX方法
parseXXX方法在包裝類中很常見,像Integer有以下方法,
在Double類中有,
public static double parseDouble(String s) throws NumberFormatException { return FloatingDecimal.parseDouble(s); }
parseXXX方法就是把字串型別的引數轉化為相應的基本型別。
XXXValue方法
在包裝類中經常看到這樣的方法,
這些方法的意思是把一種型別強轉為另一種型別,看Integer中的方法
public byte byteValue() { return (byte)value; }
就是把型別為int的value強轉為byte,在強轉的時候型別轉換異常
public double doubleValue() { return (double)value; }
把型別為int的value強轉為double。其他的方法也是類似的,都是強轉。
為什麼要在包裝類中要包裝強轉的方法那,在使用基本資料型別時,可以使用下面的方式,
double b=89.0; int a= (int) b;
由於是包裝類,又包裝了基本型別,那麼就應該具備強轉為其他型別的方法,所以提供了XXXValue方法,作為包裝型別向其他基本型別的強轉。
三、總結
重點分析了以下內容,
java中的包裝類,如何理解包裝類;
java中基本資料型別及對應的包裝類;
包裝類中常用的valueOf、parseXXX、XXXValue方法;(XXX代表byte、short、int、float等)
有不正之處歡迎指正,感謝!