更新時間:2020-05-08 16:43:33 來源:動力節點 瀏覽2412次
包裝類
Java中每一種基本類型都會對應一個唯一的包裝類,基本類型與其包裝類都可以通過包裝類中的靜態或者成員方法進行轉換。每種基本類型及其包裝類的對應關系如下,值得注意的是,所有的包裝類都是final修飾的,也就是它們都是無法被繼承和重寫的。
包裝類與基本類型的轉換
從源代碼的角度來看,基礎類型和包裝類型都可以通過賦值語法賦值給對立的變量類型,如下面的代碼所示。
Integera=1;
inta=newInteger(1);
這種語法是可以通過編譯的。但是,Java作為一種強類型的語言,對象直接賦值給引用類型變量,而基礎數據只能賦值給基本類型變量,這個是毫無異議的。那么基本類型和包裝類型為什么可以直接相互賦值呢?這其實是Java中的一種“語法糖”。“語法糖”是指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會(來自百度百科)。換句話說,這其實是一種障眼法,那么實際上是怎么樣的呢?下面是Integera=1;語句編譯的字節碼。
0:iconst_1
1:invokestatic#2
4:astore_1
首先,生成一個常量1,然后調用Integer.valueOf(int)方法返回Integer對象,最后將對象的地址(引用)賦值給變量a。Integera=1;其實相當于Integera=Integer.valueOf(1);。
其他的包裝類都是類似的,下表是所有包裝類中的類型轉換方法。
“神奇”的包裝類
如果不了解包裝類中的一些機制,我們有時會碰到一些莫名其妙的問題,丈二和尚——摸不著頭腦。
“莫名其妙”的NullPointException
在筆者開發經歷中,碰到過不少因為請求參數或者接口定義字段設置為int(或者其他基本類型)而導致NullPointException。代碼大致地運行步驟如下所示,當然不會跟這個完全一樣。
Integera=null;
...
intb=a;//拋出NullPointException
上面的代碼可以編譯通過,但是會拋出空指針異常(NullPointException)。前面已經說過了,intb=a實際上是intb=a.intValue(),由于a的引用值為null,在空對象上調用方法就會拋出NullPointException。
兩個包裝類引用相等性
在Java中,“==”符號判斷的內存地址所對應的值得相等性,具體來說,基本類型判斷值是否相等,引用類型判斷其指向的地址是否相等。看看下面的代碼,兩種類似的代碼邏輯,但是得到截然不用的結果。
這個必須從源代碼中才能找到答案。Integer類中的valueOf()方法的源代碼如下:
由于1屬于[-128,127]集合范圍內,所以valueOf()每次都會取出同一個Integer對象,故第一個“==”判斷結果為true;而222不屬于[-128,127]集合范圍內,所以valueOf()每次都會創建一個新的Integer對象,由于兩個新創建的對象的地址不一樣,故第一個“==”判斷結果為false。
以上就是動力節點java培訓機構的小編針對“Java核心基礎,java包裝類數據”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習