徹底搞懂 Java 變量的數據類型

本篇文章,我們來學習一下 Java 的數據類型,文章的大綱如下。

衆所周知,程序中每個變量在內存中都佔用一定的空間,至於變量佔用多少內存則完全取決於其數據類型。

在 Java 中變量的數據類型可以分爲兩大類:

原始數據類型,有的文檔裏也稱作基礎數據類型。原始類型的變量直接在分配給變量的內存中存儲變量的值。例如,數字或字符型的變量,注意是字符不是字符串變量

對象類型的變量不同於原始類型的變量。對象類型的變量也稱爲引用,因爲變量本身不持有對象的數據,持有的是對對象的引用,引用指向內存中存儲整個對象的其他位置(內存地址)。通過存儲在變量中的引用,程序可以訪問被引用對象的字段和方法。

可以有許多不同的變量引用同一個對象。但是,這對於原始數據類型是不可能的。

原始數據類型

下表列出了,Java 提供的 8 種基礎數據類型

u7C0kc

這些是原始數據類型意味着它們不是對象,也不是對對象的引用(類和對象將在本 Java 教程後面的章節中學習)。

對象類型

Java 原始的數據類型也有與之對應的對象類型版本,有時候也把這些類型稱爲包裝類。下面的核心對象數據類型列表中包含原始類型對應的對象類型,還包含 Java 中的另外一個非常重要的核心對象類型 -- String 類型。

TZaEer

上面列出的就是 Java 中提供的最核心的對象類型,當然我們還可以通過自定義 Class 創建更復雜的數據類型。值得注意的一點是 Java 中的字符串並不是原始類型,String 其本質上是由只讀 char[] 數組實現的對象類型,關於字符串後面會有章節進行詳細的說明,這裏先關注 Java 的數據類型。

下面是幾個在程序中,聲明和初始化對象類型的例子:

Integer myInteger;
myInteger = new Integer(45);

Character capitalA = new Character('A');

String myString = new String("ABC");

類型的裝箱和拆箱

在 Java 5 之前,我們必須在原始類型的包裝類對象上調用方法,才能將它們存儲的原始類型的值獲取出來。例如:

Integer myInteger = new Integer(45);

int myInt = myInteger.intValue();

從 Java 5 開始,Java 引入了 “自動裝箱和拆箱”(Auto box/unbox) 的機制。這意味着 Java 可以在需要的時候自動把原始類型的值 “裝箱” 到對應的包裝類對象中,也可以從包裝類對象中自動 “拆箱” 出對應的原始類型的值。例如,之前的例子可以這樣寫:

Integer myInteger = new Integer(45);

int myInt = myInteger;

在這種情況下,Java 會自動 “拆箱” myInteger 變量引用的 Integer 對象,從中提取 int 值並將該值賦給 myInt 變量。

與之相似的,如果沒有自動 “裝箱”,我們在原始類型和對應的包裝類之間進行轉換時,需要這麼寫:

int myInt = 45;

Integer myInteger = new Integer(myInt);

有了自動 “裝箱” 後:

Integer myInteger = 45;

Java 會自動將原始數據類型的值 “裝箱” 到相應類型的包裝類對象中。

Java 的自動裝箱功能使我們能夠在通常需要該數據類型的包裝類對象的地方仍然使用原始數據類型的變量,反之亦然。不過要記住一個坑。對象類型的變量(值是對象的引用)可以指向 null,這意味着它可以不指向任何實際存在的對象。

如果嘗試將 null 自動拆箱轉換爲原始值,程序執行到這塊時將收到 NullPointerException 異常(導致程序失敗的錯誤),比如下面這個例子:

Integer myInteger = null;

int myInt = myInteger;

這段代碼可以編譯,但執行時會導致 NullPointerException,因爲變量 myInteger 指向 null (不指向任何對象)。因此不可能拆箱出它指向的對象的值。

進制、bit 和 Byte

提到數據類型,必然會跟隨的一個描述,就是它們佔用的字節數,可以表示多少位等等。那麼最後,再讓我們快速過一下 進制、bit 和 Byte 三者之間的關係。

十進制

每一位可以是 0~9 這 10 個值,到 10 進位,一百用十進制表示就是 100,十就是 10。

二進制

每一位可以是 0 和 1 這兩個值,到 2 進位。一百用二進制表示是 1100100,十是 1010。

十六進制

每一位可以是 0~F 這 16 個值,到 16 進位。一百用十六進制表示就是 64,十就是 A。

bit 和 byte

總結

這篇文章的內容依然很簡單,但不要因爲就簡單就忽視,打好基礎了,後面打怪升級才能快。

如果你喜歡我的文章歡迎把我的文章分享給更多人,後面我們會把 Java 數據類型中稍微複雜點的數組以及日常使用操作特多的 String 類型單獨寫兩篇文章整理一下它們知識點,以及常見的引起程序錯誤的陷阱。

JavaMemo 和我一起,零基礎學 Java!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/TZRKzGgqsXPXiXJX8X4HeA