所以我有以下测试代码实现

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语句验证了相同)。

分析解答

您对如何进行绑定的理解是不正确的。

绑定有两个步骤:

  1. 决定调用哪个超载
  2. 决定调用哪个实现。

第一步是在编译时完成的,它基于变量的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。