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等)

 

有不正之處歡迎指正,感謝!

相關文章