Java表示式轉型規則詳解
先上一道題:
想要正確解答這道題,需要知道Java表示式轉型規則:當一個java算術表示式中包含多個基本型別的值時,整個算術表示式的資料型別將發生自動提升。Java定義如下的自動提升規則:
1. 所有byte型、short型和char型將被提升到int型。
2. 整個算術表示式的資料型別自動提升到與表示式中最高等級運算元同樣的型別。運算元的等級排列如下圖所示,位於箭頭右邊型別的等級高於位於箭頭左邊型別的等級:
結合例項詳細講解Java表示式轉型規則:
1、運算元中有double、float、long的時候,按照最高的型別進行轉換
double a = 1.0; int b = 3;
那麼 a+b 為double型
2、如果沒有這幾種,則byte、char、short都轉化為int
byte a = 1; byte b = -2;
那麼 a+b 為int型
3、final修飾的變數不會轉換型別,但是進行操作的時候,操作結果依據左運算元的型別進行轉換
byte a = 1; final byte b = 2;
那麼 a+b 為int型(雖然b不會改變型別,依據左邊的a的型別而定結果型別,但是a會自動提升為int型)
4、表示式型別自動提升的正確示例程式碼
byte b = 40; char c = 'a'; int i = 23; double d = .314; //右邊表示式中在最高等級運算元為d(double型) //則右邊表示式的型別為double型,故賦給一個double型變數 double result = b + c + i * d; //將輸出144.222 System.out.println(result);
5、如果表示式中包含了字串,則又是另一番情形了:因為把加號(+)放在字串和基本型別值之間時,這個加號是一個字串連線運算子,而不是進行加法運算。看如下程式碼:
//輸出字串Hello!a7 System.out.println("Hello!" + 'a' + 7); //輸出字串104Hello! System.out.println('a' + 7 + "Hello!");
對於第一個表示式"Hello!" + 'a' + 7,先進行"Hello!" + 'a'的運算,將把'a'轉換成字串,將拼接成字串Hello!a,接著進行"Hello!a" + 7的運算,這也是一個字串連線運算,得到結果是Hello!a7。對於第二個表示式,先進行'a' + 7加法運算,其中'a'自動提升到int型,變成a對應的ASCII值:97,從97 + 7將得到104,然後進行104 + "Hello!",104會自動轉換成字串,將變成兩個字串的連線運算,從而得到104Hello!。
答案解析:本題答案應為:B、C、D
語句1錯誤:b3=(b1+b2);自動轉為int,所以正確寫法為b3=(byte)(b1+b2);或者將b3定義為int;
語句2正確:b6=b4+b5;b4、b5為final型別,不會自動提升,所以和的型別視左邊變數型別而定,即b6可以是任意數值型別;
語句3錯誤:b8=(b1+b4);雖然b4不會自動提升,但b1仍會自動提升,所以結果需要強轉,b8=(byte)(b1+b4);
語句4錯誤:b7=(b2+b5); 同上。同時注意b7是final修飾,即只可賦值一次,便不可再改變