java运算符优先级决定表达式分组顺序,结合性解决同级运算连接方向;高优先级如*、/、%先于+、−,关系运算符高于&&,&&高于||,赋值运算符优先级最低;多数二元运算符左结合,赋值和三元运算符右结合;括号是唯一可靠控制手段。

Java 运算符优先级直接影响表达式如何被分组和计算,不按预期加括号时,结果常与直觉不符。
高优先级运算符先绑定操作数
优先级高的运算符会“抢先”和它紧邻的操作数结合,形成子表达式。这不是执行顺序,而是语法结构上的分组规则。
-
* / % 总是比 + - 先参与分组:比如
a + b * c等价于a + (b * c),不是(a + b) * c -
== != 比 & ^ | 高:写
flags & mask == 0实际被解析为flags & (mask == 0),而mask == 0是 boolean,无法和 int 做位与,直接编译报错 -
&& 比 || 高:表达式
a || b && c等价于a || (b && c),不是(a || b) && c
赋值运算符优先级最低,容易被低估
所有赋值类运算符(=、+=、== 等)都处于最底层,这意味着它们总是在整个右侧表达式算完后才执行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
int x = a + b && c;中,a + b && c全部求值完毕(先算a + b,再用结果与c做逻辑与),最后把布尔结果赋给x -
boolean flag = obj instanceof String == null;实际是flag = ((obj instanceof String) == null),但布尔值不能和null比较,编译失败;正确写法应是obj instanceof String && obj != null
结合性决定同级运算的连接方向
当多个相同优先级的运算符连续出现时,结合性决定它们如何配对。
-
左结合(多数二元运算符):如
a - b - c→(a - b) - c;a / b * c→(a / b) * c -
右结合(赋值与三元):如
a = b = 5→a = (b = 5),所以b先被赋值;a ? b : c ? d : e→a ? b : (c ? d : e) -
一元运算符注意前/后缀差异:
!a == b是(!a) == b;a++ == b是先比a和b,再自增;++a == b是先自增再比
括号是唯一可控、明确、安全的方式
优先级和结合性是语言规范,不可更改。靠记忆15级表格既难又易错,真正可靠的手段只有一种:
- 看到
&和==同现,就加括号:(flags & mask) == 0 - 混合
&&和||时,哪怕逻辑清晰也建议括起来:(a && b) || (c && d) - 涉及
instanceof或 record 字段访问时,把类型检查整体括起:(obj instanceof Point p) && p.x > 0
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










