Java自動裝箱/拆箱 - Java那些事兒

清淺池塘發表於2017-09-29

昨天Java基本資料型別和引用型別一文中漏了幾張圖,已經補上,需要的自己回頭去看,本系列文章首發於公眾號:saysayJava。

讓人疑惑的Java程式碼 - Java那些事兒 一文中我們說到編譯器自動為我們加上valueOf這個方法嗎?忘了沒關係,我們來回顧一下,原始碼如下:

Java自動裝箱/拆箱 - Java那些事兒

編譯一下,拿到class檔案,我們反編譯一下,變成了如下程式碼:

Java自動裝箱/拆箱 - Java那些事兒

這個加上valueOf方法的過程,就是Java中經常說的裝箱過程。

Java中一共有四類八種基本資料型別,除掉這幾種型別,其它的都是物件,也就是引用型別。在JDK1.5中,給這四類八種基本型別加入了包裝類,對應如下:

基本型別 包裝型別

第一類:整型
byte Byte
short Short
int Integer
long Long

第二類:浮點型
float Float
double Double

第三類:邏輯型
boolean Boolean

第四類:字元型
char Character

再看如下程式碼:

Java自動裝箱/拆箱 - Java那些事兒

編譯後的class檔案:

Java自動裝箱/拆箱 - Java那些事兒

可以看出來,當我們變數宣告為物件型別而賦值為基本資料型別時,Java編譯器會對我們的基本資料型別進行裝箱,而我們的變數宣告為基本型別賦值為物件型別時,編譯器又會對我們的物件型別進行拆箱處理。似乎大家都商量好了,用valueOf作為裝箱方法,拆箱方法就各自表述吧,一般都是基本資料型別加上Value做為拆箱方法,如intValue,longValue,booleanValue,其它包裝型別也大同小異,我就不一一測試了,大家自己動手試試吧。

將int的變數轉換成Integer物件,這個過程叫做裝箱,
反之將Integer物件轉換成int型別值,這個過程叫做拆箱。
以上這些裝箱拆箱的方法是在編譯成class檔案時自動加上的,不需要程式設計師手工介入,因此又叫自動裝箱/拆箱。

看到這裡,有些朋友會說,呀,好麻煩呀,已經有了基本型別,為什麼還要用包裝類?

有人說,是為了讓Java成為純物件導向的語言,笑。

我認為,有以下幾點:

1、物件是對現實世界的模擬(一切事物皆物件,通過物件導向的方式,將現實世界的事物抽象成物件),在現實中,假設我們去一個系統(資料庫)裡查詢學生李四的年齡,如下圖:

Java自動裝箱/拆箱 - Java那些事兒

這時候,錄入員還沒給李四錄入年齡這一項,如果我們用int來宣告年齡,大家都知道int是要初始化的,預設情況下為0,0是什麼意思,沒出生嗎?(當然也可以用-1來表示未錄入,但總感覺有點怪怪的),如果用Integer來表示,就沒這個問題了,為null,就是未錄入。

2、為泛型提供了支援。

Java自動裝箱/拆箱 - Java那些事兒

3、提供了豐富的屬性和API

Java自動裝箱/拆箱 - Java那些事兒Java自動裝箱/拆箱 - Java那些事兒

注意,比較兩個值是否相等請用equals方法,我在讓人疑惑的Java程式碼 - Java那些事兒 一文中已經說得很清楚了,這裡就不深入了。

4、暫時還沒想起來,想起來再補充。

下面我們分析一下不同的宣告方式在記憶體中的展現,程式碼如下:

Java自動裝箱/拆箱 - Java那些事兒

表現如下圖:

Java自動裝箱/拆箱 - Java那些事兒


如果喜歡本系列文章,請為我點贊或順手分享,您的支援是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最後別忘了關注一下我。

轉載無限歡迎,但請註明「作者」和「原文地址」。轉載請在文中保留此段,感謝您對作者版權的尊重。如需商業轉載或刊登,請聯絡作者獲得授權。

上一篇:Java基本資料型別和引用型別 - Java那些事兒

下一篇:物件導向 - Java那些事兒


相關文章