java复合赋值运算符(+=、-=、*=、/=、%=、&=、|=、^=、=、>>>=)本质是“先计算再赋值”的语法糖,自带隐式窄化类型转换,如short s=1; s+=1等价于s=(short)(s+1),而s=s+1需手动强转;支持数组元素等左值,但不支持final变量、方法调用或表达式。

Java 中的复合赋值运算符(如 +=、-=、*= 等)本质是“先计算再赋值”的语法糖,能减少重复书写变量名,让代码更简洁、可读性更高。
复合赋值运算符有哪些
Java 支持以下常用复合赋值运算符:
-
+=:加法赋值(a += b等价于a = a + b) -
-=:减法赋值 -
*=:乘法赋值 -
/=:除法赋值 -
%=:取余赋值 -
&=、|=、^=:位与、位或、异或赋值 、<code>>>=、>>=(无符号):位移赋值
为什么能简化代码
核心在于避免重复写左边变量名和类型转换隐含逻辑。例如:
// 普通写法,冗长且易错
int count = 10;<br> count = count + 5;
// 复合写法,简洁明确
int count = 10;<br> count += 5;
当变量名较长或带下标/属性访问时,优势更明显:user.getProfile().getPreferences().setScore(user.getProfile().getPreferences().getScore() + 10);
改成:user.getProfile().getPreferences().setScore(… += 10); 不行 —— 注意:复合赋值要求左边必须是**可赋值的变量(lvalue)**,不能是方法调用或表达式。所以上面例子不能直接用 +=,必须先存到局部变量。
使用时要注意的细节
复合赋值不是简单替换,它隐含一次自动类型转换(窄化转换),可能影响结果:
-
short s = 1;<br>s += 1;
✅ 合法 —— 编译器自动处理为s = (short)(s + 1) -
short s = 1;<br>s = s + 1;
❌ 编译错误 —— 因为s + 1结果是int,不能直接赋给short - 浮点数参与时也类似:
float f = 1.5f;<br>f *= 2;
等价于f = (float)(f * 2) - 字符串拼接:
String s = "Hello";<br>s += " World";
是合法的,底层调用StringBuilder,但注意性能场景慎用
什么情况下不能用复合赋值
只要左边不是独立变量,就无法使用:
- 数组元素可以:
arr[i] += 2;✅(因为arr[i]是左值) - final 变量不行:
final int x = 5;<br>x += 1;
❌ 编译报错 - 方法返回值、字面量、表达式都不行:
getValue() += 10;❌ - 三元运算符结果也不行:
(flag ? a : b) += 1;❌
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











