所以我有下面的测试代码实现
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));
}
据我所知,当我传递Employee类型的对象并且E1实例也是Employee类型时,多态性应将E1与方法equals(Employee obj)
绑定(尽管对对象基础实例的引用是Employee类型)。
但是,我看到它显示false,这意味着equals(Object obj)
已被调用(两个equals方法中都已使用Sysout语句验证了相同内容。)
答案 0 :(得分:3)
您对绑定方式的理解不正确。
绑定有两个步骤:
第一步是在编译时完成的,并且基于变量的 compile-time 类型。第二步在运行时完成,并基于对象的运行时类型。第二步就是您所说的“多态性”。
第一步,E1
的编译时间类型为Object
,因此equals
中只有一个 overload 可供选择--{{ 1}}。因此,选择了过载。
第二步中,有两个实现供您选择:
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
类中的实现,该实现全部返回false时间。