Java基礎(chǔ)之隱式轉(zhuǎn)換vs強制轉(zhuǎn)換
Java中,經(jīng)??梢杂龅筋愋娃D(zhuǎn)換的場景,從變量的定義到復(fù)制、數(shù)值變量的計算到方法的參數(shù)傳遞、基類與派生類間的造型等,隨處可見類型轉(zhuǎn)換的身影。Java中的類型轉(zhuǎn)換在Java編碼中具有重要的作用。
在定義變量時,有許多要注意的問題,一不小心就會出現(xiàn)損失精度或者不兼容類型等問題。
例如:
1.定義長整型數(shù)據(jù)時,必須加后綴l或L
long l =123456789012345L
2.定義單精度類型時(7-8位有效數(shù)字),必須加后綴 f 或 F
float f = 12.5F
3. boolean類型不可以轉(zhuǎn)換為其它的數(shù)據(jù)類型。
這其中,我們常常會遇到數(shù)據(jù)類型的轉(zhuǎn)換問題,最為常見的要屬隱式轉(zhuǎn)換和強制轉(zhuǎn)換了,我們來分析一下。
隱式轉(zhuǎn)換
特征:
從小到大,可以隱式轉(zhuǎn)換,數(shù)據(jù)類型將自動提升。
byte,short,char -->int -->long -->float -->double
注意:long是8個字節(jié),float是4個字節(jié)。
long是整數(shù),float是浮點型,整數(shù)和浮點數(shù)的存儲規(guī)則不一樣,記住一點long的范圍是小于float的。
例 :
byte a=10;
int b=a;
當(dāng)編譯intb=a 時, a隱式轉(zhuǎn)換為int類型。
強制轉(zhuǎn)換
特征:
從大到小(如果你明確知道數(shù)據(jù)是可以用該數(shù)據(jù)類型來表示的,可以用強制轉(zhuǎn)換)
格式:
(轉(zhuǎn)換后的數(shù)據(jù)類型)變量或者值。
注:一般情況下,根本不推薦使用強制類型轉(zhuǎn)換。
例1 :
int a=10; byte b=(byte)a;
當(dāng)編譯 byte b=(byte)a時, a被強制轉(zhuǎn)換為byte類型。
例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類型的十進制數(shù)據(jù),
第一步:十進制130轉(zhuǎn)換成二進制數(shù)據(jù)。
10000010
第二步:130在內(nèi)存中的表示形式如下
原碼:0000000000000000 00000000 10000010
第三步:求int130的補碼
因為130是正數(shù),所以,反碼和補碼都和原碼一致。
補碼:0000000000000000 00000000 10000010
第四步:對補碼進行截取,只剩下最后8位。
(byte)130 的補碼為:10000010
第五步:把該補碼轉(zhuǎn)化為原碼。
由于符號位(第一位)是1,故該數(shù)為負(fù)數(shù),
反碼:10000001 (補碼-1)
原碼:11111110 (符號位不變,數(shù)據(jù)位取反)
轉(zhuǎn)化為十進制為 -126,所以最終打印-126。
例3 :
shorts = 1; s= s +1;
和
shorts = 1; s+=1;
有問題嗎?為什么呢?
解析:
第一程序會報錯:錯誤:不兼容的類型:從int轉(zhuǎn)換到short可能會有損失
原因:s=s+1;s+1會隱式轉(zhuǎn)換為int類型,當(dāng)把一個int類型賦值給short類型是,可能會損失。
第二個程序可以編譯運行。
原因:s+=1,雖然可以看做s=s+1,但是還是有區(qū)別的,s+=1中有一個強制轉(zhuǎn)換,即s=(short)(s+1),會把s+1的值強制轉(zhuǎn)換為short類型,故不會報錯。
小結(jié):
數(shù)據(jù)類型轉(zhuǎn)換的問題如果發(fā)生在一些小程序上,我們或許能夠一眼看出,可是當(dāng)編寫一個龐大的系統(tǒng)時,擁有龐大數(shù)據(jù)量時,這些小小的問題可能導(dǎo)致系統(tǒng)出錯甚至崩潰,所以前期代碼編寫的嚴(yán)謹(jǐn)性就得靠我們自己把握了。
以上內(nèi)容給大家介紹了Java基礎(chǔ)之隱式轉(zhuǎn)換vs強制轉(zhuǎn)換,希望大家喜歡。
相關(guān)文章
SpringCloud中的分布式鎖用法示例詳解(Java+Redis SETNX命令)
在Spring Cloud項目中,使用Java和Redis結(jié)合實現(xiàn)的分布式鎖可以確保訂單的一致性和并發(fā)控制,分布式鎖的使用能夠在多個實例同時提交訂單時,僅有一個實例可以成功進行操作,本文給大家介紹Spring,Cloud中的分布式鎖用法詳解(Java+Redis SETNX命令),感興趣的朋友一起看看吧2023-10-10SpringBoot集成Mybatis的實現(xiàn)步驟
這篇文章主要介紹了SpringBoot集成Mybatis的實現(xiàn)步驟,本文通過SpringBoot +MyBatis 實現(xiàn)對數(shù)據(jù)庫學(xué)生表的查詢操作,需要的朋友可以參考下2020-12-12Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步
這篇文章主要為大家介紹了Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06基于SpringBoot實現(xiàn)Web應(yīng)用的登錄與退出功能
登錄與退出功能作為 Web 應(yīng)用中的基礎(chǔ)且重要的組成部分,直接關(guān)系到用戶的安全和隱私保護,所以本文給大家介紹了基于SpringBoot實現(xiàn)Web應(yīng)用的登錄與退出功能,文中有詳細的代碼供大家參考,需要的朋友可以參考下2024-04-04