先上一道題:java
當一個java算術表達式中包含多個基本類型的值時,整個算術表達式的數據類型將發生自動提高。Java定義以下的自動提高規則:
1. 全部byte型、short型和char型將被提高到int型。
2. 整個算術表達式的數據類型自動提高到與表達式中最高等級操做數一樣的類型。操做數的等級排列以下圖所示,位於箭頭右邊類型的等級高於位於箭頭左邊類型的等級:blog
結合實例詳細講解Java表達式轉型規則:字符串
一、操做數中有double、float、long的時候,按照最高的類型進行轉換class
double a = 1.0; int b = 3;
那麼 a+b 爲double型
二、若是沒有這幾種,則byte、char、short都轉化爲int變量
byte a = 1; byte b = -2;
那麼 a+b 爲int型
三、final修飾的變量不會轉換類型,可是進行操做的時候,操做結果依據左操做數的類型進行轉換數據類型
byte a = 1; final byte b = 2;
那麼 a+b 爲int型(雖然b不會改變類型,依據左邊的a的類型而定結果類型,可是a會自動提高爲int型)float
四、表達式類型自動提高的正確示例代碼im
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);
五、若是表達式中包含了字符串,則又是另外一番情形了:由於把加號(+)放在字符串和基本類型值之間時,這個加號是一個字符串鏈接運算符,而不是進行加法運算。看以下代碼:d3
//輸出字符串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;b四、b5爲final類型,不會自動提高,因此和的類型視左邊變量類型而定,即b6能夠是任意數值類型;語句3錯誤:b8=(b1+b4);雖然b4不會自動提高,但b1仍會自動提高,因此結果須要強轉,b8=(byte)(b1+b4);語句4錯誤:b7=(b2+b5); 同上。同時注意b7是final修飾,即只可賦值一次,便不可再改變