天天看點

Number 類及各子類所占位元組數源碼分析

這是《水煮 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 類及各子類所占位元組數源碼分析

:::

Number

類除了是基本資料類型的父類,同時也是

java.util.concurrent.atomic

包下

Atomic

原子類的父類,相關 UML 類圖如下:

::: hljs-center

Number 類及各子類所占位元組數源碼分析

:::

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 {
}