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

Java中equals方法重载与重写的调用规则及运行异常问题咨询

Java equals方法重载调用逻辑及异常现象解答

重载方法调用优先级问题

Java的方法重载是编译期静态分派的,调用哪个重载版本完全由参数的静态声明类型决定,和运行时的实际对象类型无关:

  • 如果你声明person2变量时用的类型是Object(比如Object person2 = new Person("张三", 20);),编译期会把person1.equals(person2)的参数识别为Object类型,优先匹配从Object类继承的原生equals(Object)方法,不会走你自定义的equals(Person)重载版本。原生equals只会比对两个对象的内存地址,两个独立对象地址不同,所以返回false。
  • 当你手动把person2强转为Person类型后,参数的静态声明类型变为Person,编译期就会匹配到你重载的equals(Person)方法,按属性值比对,所以返回true。

另外你贴的重载方法代码有笔误,漏了返回值类型,正确写法应该是:

public boolean equals(Person person) {
  return person.getAge() == this.age && person.getName().equals(this.name);
}

运行结果波动的原因

这个现象和JVM缓存无关,基本都是开发工具的增量编译异常导致的:
现在常用的IDE默认都是增量编译,只会重新编译检测到修改的文件。如果你删除、粘贴方法的操作过快,或者IDE出现临时卡顿,会出现新修改的代码没有被编译成最新class文件的问题,运行时加载的还是旧版本的字节码,就会出现结果和预期不符的情况。
你可以每次修改代码后先执行「清理项目→全量重新构建」,再运行就能得到一致的结果,不会出现这种波动。

内容的提问来源于stack exchange,提问作者Aaronv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:24:01