所以我有以下测试代码实现
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语句验证了相同)。
分析解答
您对如何进行绑定的理解是不正确的。
绑定有两个步骤:
- 决定调用哪个超载
- 决定调用哪个实现。
第一步是在编译时完成的,它基于变量的compile-time类型。第二步是在运行时完成的,它基于对象的运行时类型。第二步是你所说的"polymorphism"。
在第一步中,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。