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

 

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