1. 程式人生 > >復合賦值和簡單復制的區別

復合賦值和簡單復制的區別

強制 effect 不能 包裝 操作 操作符 限制 通過 編寫一個程序

編寫一個程序

使得x+=i合法, x = x+i; 不合法。

許多人會認為第一個表達式和第二個表達式是完全等價的,這是錯誤的。

在java 中 復合賦值 E1 op= E2 等價於簡單賦值E1 = (T)((E1)op(E2));

其中T 表示的是E1的類型。

換句話說復合賦值的最後結果類型和左操作數的一致的。

如果最後結果的類型和左操作數的類型一樣,那麽這兩個表達式就完全等價。

假若最後結果的類型比左操作數的類型要寬,那麽復合賦值操作符將悄悄的執行一個窄化過程。

例:

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 類型。

復合賦值和簡單復制的區別