复合赋值和简单复制的区别
编写一个程序
使得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 类型。