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

昨天Java基本數據類型和引用類型一文中漏了幾張圖,已經補上,須要的本身回頭去看,本系列文章首發於公衆號:saysayJava。程序員

讓人疑惑的Java代碼 - Java那些事兒 一文中咱們說到編譯器自動爲咱們加上valueOf這個方法嗎?忘了不要緊,咱們來回顧一下,源代碼以下:
數據庫

編譯一下,拿到class文件,咱們反編譯一下,變成了以下代碼:post

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

Java中一共有四類八種基本數據類型,除掉這幾種類型,其它的都是對象,也就是引用類型。在JDK1.5中,給這四類八種基本類型加入了包裝類,對應以下:3d

基本類型 包裝類型cdn

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

第二類:浮點型
float Float
double Doubleblog

第三類:邏輯型
boolean Boolean內存

第四類:字符型
char Characterget

再看以下代碼:

編譯後的class文件:

能夠看出來,當咱們變量聲明爲對象類型而賦值爲基本數據類型時,Java編譯器會對咱們的基本數據類型進行裝箱,而咱們的變量聲明爲基本類型賦值爲對象類型時,編譯器又會對咱們的對象類型進行拆箱處理。彷佛你們都商量好了,用valueOf做爲裝箱方法,拆箱方法就各自表述吧,通常都是基本數據類型加上Value作爲拆箱方法,如intValue,longValue,booleanValue,其它包裝類型也大同小異,我就不一一測試了,你們本身動手試試吧。

將int的變量轉換成Integer對象,這個過程叫作裝箱,
反之將Integer對象轉換成int類型值,這個過程叫作拆箱。
以上這些裝箱拆箱的方法是在編譯成class文件時自動加上的,不須要程序員手工介入,所以又叫自動裝箱/拆箱。

看到這裏,有些朋友會說,呀,好麻煩呀,已經有了基本類型,爲何還要用包裝類?

有人說,是爲了讓Java成爲純面向對象的語言,笑。

我認爲,有如下幾點:

一、對象是對現實世界的模擬(一切事物皆對象,經過面向對象的方式,將現實世界的事物抽象成對象),在現實中,假設咱們去一個系統(數據庫)裏查詢學生李四的年齡,以下圖:

這時候,錄入員還沒給李四錄入年齡這一項,若是咱們用int來聲明年齡,你們都知道int是要初始化的,默認狀況下爲0,0是什麼意思,沒出生嗎?(固然也能夠用-1來表示未錄入,但總感受有點怪怪的),若是用Integer來表示,就沒這個問題了,爲null,就是未錄入。

二、爲泛型提供了支持。

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

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

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

下面咱們分析一下不一樣的聲明方式在內存中的展示,代碼以下:

表現以下圖:


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

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

上一篇:Java基本數據類型和引用類型 - Java那些事兒

下一篇:面向對象 - Java那些事兒

相關文章
相關標籤/搜索