Java基礎(chǔ)之隱式轉(zhuǎn)換vs強(qiáng)制轉(zhuǎn)換
Java中,經(jīng)??梢杂龅筋?lèi)型轉(zhuǎn)換的場(chǎng)景,從變量的定義到復(fù)制、數(shù)值變量的計(jì)算到方法的參數(shù)傳遞、基類(lèi)與派生類(lèi)間的造型等,隨處可見(jiàn)類(lèi)型轉(zhuǎn)換的身影。Java中的類(lèi)型轉(zhuǎn)換在Java編碼中具有重要的作用。
在定義變量時(shí),有許多要注意的問(wèn)題,一不小心就會(huì)出現(xiàn)損失精度或者不兼容類(lèi)型等問(wèn)題。
例如:
1.定義長(zhǎng)整型數(shù)據(jù)時(shí),必須加后綴l或L
long l =123456789012345L
2.定義單精度類(lèi)型時(shí)(7-8位有效數(shù)字),必須加后綴 f 或 F
float f = 12.5F
3. boolean類(lèi)型不可以轉(zhuǎn)換為其它的數(shù)據(jù)類(lèi)型。
這其中,我們常常會(huì)遇到數(shù)據(jù)類(lèi)型的轉(zhuǎn)換問(wèn)題,最為常見(jiàn)的要屬隱式轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換了,我們來(lái)分析一下。
隱式轉(zhuǎn)換
特征:
從小到大,可以隱式轉(zhuǎn)換,數(shù)據(jù)類(lèi)型將自動(dòng)提升。
byte,short,char -->int -->long -->float -->double
注意:long是8個(gè)字節(jié),float是4個(gè)字節(jié)。
long是整數(shù),float是浮點(diǎn)型,整數(shù)和浮點(diǎn)數(shù)的存儲(chǔ)規(guī)則不一樣,記住一點(diǎn)long的范圍是小于float的。
例 :
byte a=10;
int b=a;
當(dāng)編譯intb=a 時(shí), a隱式轉(zhuǎn)換為int類(lèi)型。
強(qiáng)制轉(zhuǎn)換
特征:
從大到?。ㄈ绻忝鞔_知道數(shù)據(jù)是可以用該數(shù)據(jù)類(lèi)型來(lái)表示的,可以用強(qiáng)制轉(zhuǎn)換)
格式:
(轉(zhuǎn)換后的數(shù)據(jù)類(lèi)型)變量或者值。
注:一般情況下,根本不推薦使用強(qiáng)制類(lèi)型轉(zhuǎn)換。
例1 :
int a=10; byte b=(byte)a;
當(dāng)編譯 byte b=(byte)a時(shí), a被強(qiáng)制轉(zhuǎn)換為byte類(lèi)型。
例2:
class QiangZhiDemo
{
public static void main(String[] args)
{
byte b=(byte)130;
System.out.println(b); //打印結(jié)果-126
}
}
解析:
數(shù)據(jù)130默認(rèn)的是int類(lèi)型的十進(jìn)制數(shù)據(jù),
第一步:十進(jìn)制130轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)。
10000010
第二步:130在內(nèi)存中的表示形式如下
原碼:0000000000000000 00000000 10000010
第三步:求int130的補(bǔ)碼
因?yàn)?30是正數(shù),所以,反碼和補(bǔ)碼都和原碼一致。
補(bǔ)碼:0000000000000000 00000000 10000010
第四步:對(duì)補(bǔ)碼進(jìn)行截取,只剩下最后8位。
(byte)130 的補(bǔ)碼為:10000010
第五步:把該補(bǔ)碼轉(zhuǎn)化為原碼。
由于符號(hào)位(第一位)是1,故該數(shù)為負(fù)數(shù),
反碼:10000001 (補(bǔ)碼-1)
原碼:11111110 (符號(hào)位不變,數(shù)據(jù)位取反)
轉(zhuǎn)化為十進(jìn)制為 -126,所以最終打印-126。
例3 :
shorts = 1; s= s +1;
和
shorts = 1; s+=1;
有問(wèn)題嗎?為什么呢?
解析:
第一程序會(huì)報(bào)錯(cuò):錯(cuò)誤:不兼容的類(lèi)型:從int轉(zhuǎn)換到short可能會(huì)有損失
原因:s=s+1;s+1會(huì)隱式轉(zhuǎn)換為int類(lèi)型,當(dāng)把一個(gè)int類(lèi)型賦值給short類(lèi)型是,可能會(huì)損失。
第二個(gè)程序可以編譯運(yùn)行。
原因:s+=1,雖然可以看做s=s+1,但是還是有區(qū)別的,s+=1中有一個(gè)強(qiáng)制轉(zhuǎn)換,即s=(short)(s+1),會(huì)把s+1的值強(qiáng)制轉(zhuǎn)換為short類(lèi)型,故不會(huì)報(bào)錯(cuò)。
小結(jié):
數(shù)據(jù)類(lèi)型轉(zhuǎn)換的問(wèn)題如果發(fā)生在一些小程序上,我們或許能夠一眼看出,可是當(dāng)編寫(xiě)一個(gè)龐大的系統(tǒng)時(shí),擁有龐大數(shù)據(jù)量時(shí),這些小小的問(wèn)題可能導(dǎo)致系統(tǒng)出錯(cuò)甚至崩潰,所以前期代碼編寫(xiě)的嚴(yán)謹(jǐn)性就得靠我們自己把握了。
以上內(nèi)容給大家介紹了Java基礎(chǔ)之隱式轉(zhuǎn)換vs強(qiáng)制轉(zhuǎn)換,希望大家喜歡。
相關(guān)文章
IDEA?高版本?PlantUML?插件默認(rèn)主題修改的詳細(xì)過(guò)程
PlantUML 是非常不錯(cuò)的使用腳本畫(huà)圖的工具,效率很高,很多人會(huì)選擇在 IDEA 中安裝 PlantUML Integration 插件,這篇文章主要介紹了IDEA?高版本?PlantUML?插件默認(rèn)主題修改,需要的朋友可以參考下2022-09-09
SpringBoot實(shí)現(xiàn)統(tǒng)一功能處理的教程詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)統(tǒng)一功能處理,文中的示例代碼講解詳細(xì),對(duì)大家學(xué)習(xí)或工作有一定借鑒價(jià)值,感興趣的同學(xué)可以參考閱讀下2023-05-05
java時(shí)間段查詢(xún)將00:00:00更換成23:59:59
本文主要介紹了java時(shí)間段查詢(xún)將00:00:00更換成23:59:59,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

