package common;
public class ShortTypeTest {
/*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
short s1 = 1; s1 = (short) (s1 + 1);//簡單類型
short s2=1; s2 +=1;//複合類型,複合賦值操作符+=,
System.out.println(s1+";"+s2);
//運行時Console輸出什麼,你知道嗎?
}
}
關於一道Java面試題,今天沒事就剖析了一下,供初學Java和不清楚的朋友參考學習。
題目:
short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
解答:
Java規範有這樣的規則
[
1.高位轉低位需要強制轉換
2.低位轉高位自動轉.
]
short s1 = 1; s1 = s1 + 1;有什麼錯?
答: i 是int 型 s1 short型 通過 + 運算後s1 自動轉爲int 型 所以錯!
short s1 = 1; s1 += 1;有什麼錯?
答: 如果你認爲表達式(x += i)只是表達式(x = x + i)的簡寫方式,這並不準確。
這兩個表達式都被稱爲賦值表達式。(x = x + i)表達式使用的是簡單賦值操作符(=),而(x += i)表達式使用的是複合賦值操作符。Java語言規範中講到,複合賦值(E1 op=E2)等價於簡單賦值(E1=(T)((E1) op (E2))),其中T是E1的類型,除非E1只被計算一次。 換句話說,複合賦值表達式自動地將所執行計算的結果轉型爲其左側變量的類型。如果結果的類型與該變量的類型相同,那麼這個轉型不會造成任何影響。然而,如果結果的類型比該變量的類型要寬,那麼複合賦值操作符將悄悄地執行一個窄化原生類型轉換。
因此,複合賦值表達式可能是危險的。爲了避免這種令人不快的突襲,請不要將複合賦值操作符作用於byte、short或char類型的變量。 因爲S1是short型的,佔2個字節,而1是int型的,佔4個字節。在兩個類型的值相加的時候,會發生自動類型的提升,要不然數據也裝不下呀,是這個道理吧*_*。也就是說s1+1後,其結果是int型的,而不是short型的,所以可以想想看,把4個字節的東西放在兩個字節的空間裏,肯定編譯不通過。
後面的那個不會發生類型的提升,JAVA規範上說 【e1+=e2 實際上是 e1=(T1)(e1+e2) 】,其中T1是e1的數據類型。 s1+=1等效於 s1=(short)(s1+1),所以是正確的。
不知道現在你是否清楚這個原理了呢?如果再遇到類似的問題,你知道怎樣去剖析解答了嗎?