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
相关产品推荐
相关产品推荐

