Java中,經常可以遇到類型轉換的情境,從變數的定義到複製、數值變數的計算到方法的參數傳遞、基類與衍生類別間的造型等,隨處可見類型轉換的身影。Java中的類型轉換在Java編碼中具有重要的作用。
在定義變數時,有許多要注意的問題,一不小心就會出現損失精度或者不相容類型等問題。
例如:
1.定義長整型資料時,必須加尾碼l或L
long l =123456789012345L
2.定義單精確度類型時(7-8位有效數字),必須加尾碼 f 或 F
float f = 12.5F
3. boolean類型不可以轉換為其它的資料類型。
這其中,我們常常會遇到資料類型的轉換問題,最為常見的要屬隱式轉換和強制轉換了,我們來分析一下。
隱式轉換
特徵:
從小到大,可以隱式轉換,資料類型將自動提升。
byte,short,char -->int -->long -->float -->double
注意:long是8個位元組,float是4個位元組。
long是整數,float是浮點型,整數和浮點數的儲存規則不一樣,記住一點long的範圍是小於float的。
例 :
byte a=10;
int b=a;
當編譯intb=a 時, a隱式轉換為int類型。
強制轉換
特徵:
從大到小(如果你明確知道資料是可以用該資料類型來表示的,可以用強制轉換)
格式:
(轉換後的資料類型)變數或者值。
註:一般情況下,根本不推薦使用強制類型轉換。
例1 :
當編譯 byte b=(byte)a時, a被強制轉換為byte類型。
例2:
class QiangZhiDemo { public static void main(String[] args) { byte b=(byte)130; System.out.println(b); //列印結果-126 } }
解析:
資料130預設的是int類型的十進位資料,
第一步:十進位130轉換成位元據。
10000010
第二步:130在記憶體中的表示形式如下
原碼:0000000000000000 00000000 10000010
第三步:求int130的補碼
因為130是正數,所以,反碼和補碼都和原碼一致。
補碼:0000000000000000 00000000 10000010
第四步:對補碼進行截取,只剩下最後8位。
(byte)130 的補碼為:10000010
第五步:把該補碼轉化為原碼。
由於符號位(第一位)是1,故該數為負數,
反碼:10000001 (補碼-1)
原碼:11111110 (符號位不變,資料位元取反)
轉化為十進位為 -126,所以最終列印-126。
例3 :
和
有問題嗎?為什麼呢?
解析:
第一程式會報錯:錯誤:不相容的類型:從int轉換到short可能會有損失
原因:s=s+1;s+1會隱式轉換為int類型,當把一個int類型賦值給short類型是,可能會損失。
第二個程式可以編譯運行。
原因:s+=1,雖然可以看做s=s+1,但是還是有區別的,s+=1中有一個強制轉換,即s=(short)(s+1),會把s+1的值強制轉換為short類型,故不會報錯。
小結:
資料類型轉換的問題如果發生在一些小程式上,我們或許能夠一眼看出,可是當編寫一個龐大的系統時,擁有龐大資料量時,這些小小的問題可能導致系統出錯甚至崩潰,所以前期代碼編寫的嚴謹性就得靠我們自己把握了。
以上內容給大家介紹了Java基礎之隱式轉換vs強制轉換,希望大家喜歡。