java - 重载时equals方法的行为如何?
问题描述
所以我有下面的测试代码实现
class Employee{
String name;
int age;
@Override
public boolean equals(Object obj) return false;
public boolean equals(Employee obj) return true;
}
在主要方法中,我有以下代码
public static void main(String[] args) {
Object E1 = new Employee();
Employee E2 = new Employee();
System.out.println(E1.equals(E2));
}
因此,根据我的理解,多态性应该将 E1 与方法绑定,equals(Employee obj)
因为我传递的是 Employee 类型的对象,而 E1 实例也是 Employee 类型(尽管对 Object 底层实例的引用是 Employee 类型)。但是,我看到它打印为 false,这意味着equals(Object obj)
已调用(已在两个 equals 方法中使用 Sysout 语句验证了相同)。
解决方案
您对绑定方式的理解是不正确的。
绑定有两个步骤:
- 决定调用哪个重载
- 决定调用哪个实现。
第一步是在编译时完成的,并且基于变量的编译时类型。第二步在运行时完成,并基于对象的运行时类型。第二步是您所说的“多态性”。
在第一步中,E1
的编译时类型是,Object
因此只有一个重载equals
可供选择 - equals(Object)
。因此,选择了该过载。
在第二步中,有两种实现可供选择:
// In Employee class:
public boolean equals(Object obj) return false;
// In Object class
public boolean equals(Object obj) {
return (this == obj);
}
由于E1
的运行时类型是Employee
,正如您正确识别的那样,它选择Employee
类中的实现,它始终返回 false 。
推荐阅读
- python - SQLAlchemy/psycopg2:JSONB 列作为字符串而不是字典 Python 返回
- c# - 从 .NET 验证 dll 具有有效签名且未被修改
- c++ - 如何查看向量中的所有元素是否相同?
- java - Angular 6:如何将 html 文件包含到组件中?
- php - 如何在 PHP 中并排绘制翻转图像和原始图像?
- android - 在 RN 项目中调用 Android UI 组件:错误 - java.lang.String 无法转换为 com.facebook.react.bridge.ReadableArray
- javascript - async.each 没有完成就没有错误
- docker - Dockerfile 中的条件运行
- javascript - 在使用 Disqus 的 Jekyll 站点中,我收到内容安全策略错误
- python - 如何在 pycryptodom 中使用 ECC 加密消息