編寫一個程序java
使得x+=i合法, x = x+i; 不合法。對象
許多人會認爲第一個表達式和第二個表達式是徹底等價的,這是錯誤的。字符串
在java 中 複合賦值 E1 op= E2 等價於簡單賦值E1 = (T)((E1)op(E2));編譯
其中T 表示的是E1的類型。class
換句話說複合賦值的最後結果類型和左操做數的一致的。變量
若是最後結果的類型和左操做數的類型同樣,那麼這兩個表達式就徹底等價。object
倘若最後結果的類型比左操做數的類型要寬,那麼複合賦值操做符將悄悄的執行一個窄化過程。引用
例:程序
short x = 0;兼容
int i = 333333;
x+=i ;
最後執行的結果 x = 5653.並不等於 333333.
這是由於最後結果int 類型的333333對於short 類型來講太大的,自動產生的轉型把int 類型的高位截掉了。
若此時將x+=i寫成x = x + I;
則編譯是通不過的,由於不能把int 類型的值賦值給short類型的值,只能經過強制轉換!x = (short) (x+i);
編寫程序
讓x = x + i;合法
讓x+=i 不合法
根據前面的那一道題你可能會認爲複合賦值領域比簡單賦值領域操縱符的限制更少。在通常狀況下是對的!
複合賦值操做符要求兩個操做數都是基本類型的,例如Int 或包裝了的基本類型Integer,可是有一個例外:若是在+=操做符的左側操做數是String類型的,那麼它容許右側的操做數是任意類型的,在這種狀況下,該操做符執行的是字符串的鏈接工做。 簡單的賦值操做符容許其左側的類型是對象引用類型,這就要求更寬鬆了:能夠使他們來表示任何你想表示的內容,只要表達式的右側與左側變量是賦值兼容的。
例:
Object x = 「xiao」;
String i = 「Effective java!」
簡單賦值是合法的,由於x+i 是String 類型的,而String 類型與object類型兼容:x = x + i;
複合賦值是非法的,由於左側是對象引用類型,而右側是String 類型。