Java重写equals方法中`o instanceof Point point`语句含义解析
关于Java中
instanceof模式匹配的疑问 先看定义的Point类代码:
public class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Point point)) return false; return x == point.x && y == point.y; } @Override public int hashCode() { return Objects.hash(x, y); } }
疑问
该类的equals方法由IntelliJ生成,可接收Point的子类作为参数,但无法理解if (!(o instanceof Point point))语句:为何Point后要跟point?这个point在equals方法中是如何定义的?
解答
这是Java 16及以后版本支持的instanceof模式匹配语法,把类型检查和变量绑定合并成了一步:
- 当
o instanceof Point判断为真时,JVM会自动将o强转为Point类型,同时把转换后的实例赋值给后面的point变量,你可以直接在后续代码里使用这个变量(比如后面的point.x、point.y)。 - 如果判断为假,就直接返回false,不会执行后续的相等判断逻辑。
对比传统写法,原来需要分两步实现:
if (!(o instanceof Point)) return false; Point point = (Point) o;
模式匹配把这两步简化成一行,让代码更简洁紧凑。
这里的point是在instanceof模式匹配中隐式定义的局部变量,它的作用域是当前代码分支(也就是equals方法中,if判断为真后的逻辑部分),不需要提前声明就能直接使用。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

