一、自動類型轉換
轉換的過程自動發生
規則:小——>大
byte->short->int->long->float->double
char類型識別為int,可以轉成int,不可自動轉成byte、short
二、強制類型轉換
轉換的過程強制發生
規則:大——>小
語法:類型 變量名 = (類型)值;
自增/自減運算符、復合賦值運算符底層做了優化,內部自動強制類型轉換,如:++,--,*=,/=,+=,-=……
int i = 10; short s = 5; i = s; // 正確,自動轉換 s = i; // 報錯,精度丟失,需要強制轉換 long l3 = 1000.9f; // 報錯,小數轉為整數,精度丟失,需要強制轉換 double d = 1.5f; // 正確,1.5f識別為float類型,自動轉換 float f1 = 100L; // 正確,整數部分可以直接賦值給float整數部分,自動轉換 float f2 = 100.9; // 報錯,100.9默認識別為double,這樣轉換可能失去小數點,必須強制轉換 short s1 = 5; s1 = s1 - 2; // 報錯,2被識別為int,損失精度 byte b = 2; s1 = s1 - b; // 報錯,char、byte和short運算、比較時以int存儲(為了保證不發生溢出現象),賦值損失精度 b = b + 4; // 同理,報錯 //沒報錯的原因: //編譯時候,進行檢查,看賦值大小是否超過變量的類型所容納的范圍 //如果超過,報錯:從int轉換到byte可能會有損失,如果沒超過,編譯通過 byte b1 = 120; byte b2 = 128; // 報錯,超過存儲范圍 char c1 = 'a'; int i1 = c1; // 正確,自動轉換 int i2 = 100; char c2 = i2; // 錯誤: 不兼容的類型: 從int轉換到char可能會有損失 int n = 100; char c3 = (char)n; // 正確,強制轉換 int m = 12.5*8+2.5*4; // 錯誤,float到int損失精度 int m2 = (int)(12.5*8+2.5*4); // 正確,加括號保證優先級
int a = 100;
a *= 0.5; // 正確,等價於a=(int)(a*0.5),直接進行強制轉換
byte b3 = 10;
b3++; // 正確,等價於b3=(byte)(b3+10)
【注意】
- 遵循自動提升原則,表達式的結果類型 遵循操作數中最大的類型
- 強轉符號只針對於最近的操作數有效,往往需要通過小括號提升優先級
- byte、short運算時充當int類型
- char類型只能直接存儲int的常量值(char取值范圍內)不是變量值(大到小損失精度)
- char 可以當做一種特殊的整數類型
- java中整數類型默認的int類型;小數類型默認的double
- int無法轉換為boolean
- 小數類型轉為整數類型,小數可能被舍棄,所有出現精度損失,所以需要強制轉換
- boolean 類型不能轉換成任何其它數據類型