java基礎之一:基本數據類型
- 2020 年 11 月 30 日
- 筆記
在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等)
有不正之處歡迎指正,感謝!