java類型轉換詳解(自動轉換和強制轉換)
阿新 • • 發佈:2018-03-09
代碼 oid 高精 log 相加 println 類型轉換詳解 範圍 void
自動轉換
class Hello { public static void main(String[] args) { //自動轉換 int a = 5; byte b = 6; int c = a + b; System.out.println(c); } }
a是int類型,b是byte類型 當二者進行加法運算時(根據同類型相加結果還是同類型) 由於int的範圍比byte的取值範圍大這個時候jvm會自動將b轉換成int類型
強制轉換
//強制轉換 int a = (int)8.8;
強制轉換就是將前面加上要轉換的類型就可以了。
下面來看比較特殊的
class Hello { public static void main(String[] args) { byte b = 3;//正確 int x = 3;//正確 b = x;//錯誤 } }
上面代碼在編譯的時候會報錯 常量3的類型為int int類型可以賦值給byte的變量 但是b=x這個時候就不行了呢 因為根據常量優化機制 這種方式只針對 常量 不針對變量 也就是說大範圍的不能賦值給小範圍 除非用強制轉換類型
在看下面的也遵循上面的原則
class Hello { public static void main(String[] args) { byte b1=3,b2=4,b;//正確 b = b1 + b2;//錯誤 因為b1 b2這個時候是變量(常量優化機制只針對常量不針對變量) b = 3 + 4;//正確 } }
在看一個例子
class Hello { public static void main(String[] args) { short s = 1; s = s + 1;//錯誤 和 short s = 1; s+=1;//正確 } }
上面的代碼從表面上看是沒什麽區別的 為什麽第二種寫法就正確了呢?
第一種算的時候 會將s自動轉換為int類型在進行加法運算(低精度轉高精度) 然後得出的結果是int類型 在賦值給short類型 這樣是不合適的(高精度不能賦值給低精度類型)所以會報錯 正確的寫法如下面代碼
class Hello { public static void main(String[] args) { short s = 1; s = (short)(s + 1); System.out.println(s); } }
那第二種為什麽是可行的呢?
因為+=、-+、*=、/= 這些運算符比較特殊 本身就具有強制類型轉換的作用。
java類型轉換詳解(自動轉換和強制轉換)