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