首页 > 解决方案 > 重载时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 语句验证了相同)。

标签: javapolymorphismoverloading

解决方案


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

绑定有两个步骤:

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

第一步是在编译时完成的,并且基于变量的编译时类型。第二步在运行时完成,并基于对象的运行时类型。第二步是您所说的“多态性”。

在第一步中,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 。


推荐阅读