You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:53:13