這是《水煮 JDK 源碼》系列 的第6篇文章,計劃撰寫100篇關于JDK源碼相關的文章
基本的資料類型是在開發過程中經常使用的,而且它們都有着與之對應的包裝類,基本的資料類型和包裝類之間會自動轉換,即所謂的自動裝箱和拆箱,但是在使用的時候,我們可能并不會過多的去關注這些包裝類的父類,下面結合具體的源碼來分析一下它們的父類
Number
類。
1、Number 類
Number
類位于
java.lang
下,實作了
java.io.Serializable
接口,它是一個抽象類,是所有可以轉換為數值的類的父類,比如
byte
、
short
、
int
、
float
、
double
這些基本的資料類型,類定義如下:
public abstract class Number implements java.io.Serializable {
/** 以 int 形式傳回指定數字的值,可能涉及到四舍五入或者截斷 */
public abstract int intValue();
/** 以 long 形式傳回指定數字的值,可能涉及到四舍五入或者截斷 */
public abstract long longValue();
/** 以 float 形式傳回指定數字的值,可能涉及到四舍五入 */
public abstract float floatValue();
/** 以 double 形式傳回指定數字的值,可能涉及到四舍五入 */
public abstract double doubleValue();
/** 以 byte 形式傳回指定數字的值,可能涉及到四舍五入或者截斷 */
public byte byteValue() {
return (byte)intValue();
}
/** 以 short 形式傳回指定數字的值,可能涉及到四舍五入或者截斷 */
public short shortValue() {
return (short)intValue();
}
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -8742448824652078965L;
}
該類定義了 4個抽象方法,分别用于擷取
int
、
long
、
float
、
double
類型的值,其中
byte
和
short
類型的值可以通過
int
值進行強制類型轉換擷取(這種由範圍大的類型轉換為範圍小的類型,實際過程中可能會存在精度丢失)。
在平時開發的過程中,我們可能很少直接使用到
Number
類,更多是使用它的子類,比如基本的資料類型
byte
、
short
、
int
、
long
、
float
、
double
這些,或者是它們各自對應的包裝類型
Byte
、
Short
、
Int
、
Long
、
Float
、
Double
,下面來分别看看這些基本資料類型的包裝類的定義。
(1)Byte 類定義
public final class Byte extends Number implements Comparable<Byte>
(2)Short 類定義
public final class Short extends Number implements Comparable<Short>
(3)Integer 類定義
public final class Integer extends Number implements Comparable<Integer>
(4)Long 類定義
public final class Long extends Number implements Comparable<Long>
(5)Float 類定義
public final class Float extends Number implements Comparable<Float>
(6)Double 類定義
public final class Double extends Number implements Comparable<Double>
這些基本的資料類型,其類的定義其實都是一樣的,都繼承于
Number
抽象類,并且實作了
Comparable
比較接口,UML 類圖如下:
::: hljs-center

:::
Number
類除了是基本資料類型的父類,同時也是
java.util.concurrent.atomic
包下
Atomic
原子類的父類,相關 UML 類圖如下:
::: hljs-center
:::
2、Number 子類所占位元組數
Number
類擁有衆多的子類,比如常見的
Byte
、
Short
、
Int
、
Long
、
Float
、
Double
,這些基本資料類型所占用的位元組數又是多少呢?
2.1 Byte 類
/** byte 類型所占的 bit 位數為 8,也就是 1 byte = 8 bits */
public static final int SIZE = 8;
/** byte 類型所占的位元組數,等于 1 */
public static final int BYTES = SIZE / Byte.SIZE;
2.2 Short 類
/** short 類型所占的 bit 位數為16,也就是 1 short = 16 bits */
public static final int SIZE = 16;
/** short 類型所占的位元組數,等于 2 */
public static final int BYTES = SIZE / Byte.SIZE;
2.3 Integer 類
/** int 類型所占的 bit 位數為32,也就是 1 int = 32 bits */
@Native public static final int SIZE = 32;
/** int 類型所占的位元組數,等于 4 */
public static final int BYTES = SIZE / Byte.SIZE;
2.4 Long 類
/** long 類型所占的 bit 位數為64,也就是 1 long = 64 bits */
@Native public static final int SIZE = 64;
/** long 類型所占的位元組數,等于 8 */
public static final int BYTES = SIZE / Byte.SIZE;
2.5 Float 類
/** float 類型所占的 bit 位數為32,也就是 1 float = 32 bits */
public static final int SIZE = 32;
/** float 類型所占的位元組數,等于 4 */
public static final int BYTES = SIZE / Byte.SIZE;
2.6 Double 類
/** double 類型所占的 bit 位數為64,也就是 1 double = 64 bits */
public static final int SIZE = 64;
/** double 類型所占的位元組數,等于 8 */
public static final int BYTES = SIZE / Byte.SIZE;
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Native {
}