Java复合赋值运算符(如+=)本质是“先运算再赋值”,自动处理类型转换与左操作数单次计算;支持算术、位运算及移位,但不支持自定义类重载。

Java 中的复合赋值运算符是把算术、位运算或移位操作和赋值合并成一个简洁写法,本质是“先运算再赋值”,但比手动写 i = i + j 更安全、更高效。
常见复合赋值运算符及等价形式
它们统一遵循 变量 op= 表达式 的格式,编译器会自动处理类型转换(隐式窄化)并确保左操作数只计算一次:
-
+=:等价于a = (T)(a + b),其中T是a的原始类型(如int i = 5; i += 4.5;→ 实际执行i = (int)(i + 4.5),结果为9) -
-=、*=、/=、%=:同理,分别对应减、乘、除、取余后强制转回左操作数类型 -
&=、|=、^=:用于整型变量的按位与、或、异或后赋值 、<code>>>=、>>>=:用于位移后赋值,注意符号右移(>>=)与无符号右移(>>>=)的区别
类型转换的隐含规则
复合赋值自带强制类型转换,这是它和普通表达式赋值的关键区别:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 写
byte b = 10; b += 5;不报错,等价于b = (byte)(b + 5),自动截断高位 - 但写
byte b = 10; b = b + 5;会编译失败,因为b + 5结果是int,不能直接赋给byte - 跨类型使用(如
int i; i += 3.14;)会静默截断小数部分,需留意精度丢失
null 值的特殊处理
多数类型遇到 null 会直接抛 NullPointerException,但有例外:
立即学习“Java免费学习笔记(深入)”;
-
String s = null; s += "abc";→ 结果为"nullabc"(编译器自动调用String.valueOf(null)) -
Integer i = null; i += 1;→ 运行时报 NPE(因尝试调用i.intValue()) - 安全做法是提前判空:
i = (i == null ? 0 : i) + 1;或用Objects.requireNonNullElse(i, 0) + 1
不支持自定义类的复合赋值
Java 不允许重载运算符,所以像 User u = new User(); u += otherUser; 是非法的。必须封装为方法调用,例如:
-
u.add(otherUser);—— 在add方法内自主控制空值逻辑 - 可设计为:若
otherUser == null,则跳过、抛异常或使用默认对象

















