重载时equals方法的行为如何?

时间:2019-07-06 15:47:31

标签: java polymorphism overloading

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

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

1 个答案:

答案 0 :(得分:3)

您对绑定方式的理解不正确。

绑定有两个步骤:

  1. 确定要调用的重载
  2. 确定要调用的实现。

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

相关问题