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

Java 重载时equals方法的行为如何?,java,polymorphism,overloading,Java,Polymorphism,Overloading,所以我有下面的测试代码实现 class Employee{ String name; int age; @Override public boolean equals(Object obj) return false; public boolean equals(Employee obj) return true; } 在main方法中,我有以下代码 public static void main(String[] args) {

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

class Employee{
     String name;
     int age;

    @Override
public boolean equals(Object obj) return false;

public boolean equals(Employee obj) return true;     
}
在main方法中,我有以下代码

public static void main(String[] args) {        
    Object E1 = new Employee();
    Employee E2 = new Employee();

    System.out.println(E1.equals(E2));

}
因此,根据我的理解,多态性应该用方法
equals(Employee obj)
绑定E1,因为我传递的对象是Employee类型的,而E1实例也是Employee类型的(尽管对对象底层实例的引用是Employee类型的)。
但是,我看到它打印false,这意味着调用了
equals(objectobj)
(在这两个equals方法中使用Sysout语句验证了这一点)。

您对绑定是如何完成的理解是不正确的

绑定有两个步骤:

  • 决定调用哪个重载
  • 决定调用哪个实现
  • 第一步在编译时完成,并基于变量的编译时类型。第二步在运行时完成,并基于对象的运行时类型。第二步是你所说的“多态性”

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

    在编译时根据声明的参数类型和接收方解析要调用的重载方法。由于E1是声明类型的Object,所以唯一可能调用的方法是equals(Object)(因为Object没有任何其他equals()方法)。然后polymorhism在运行时调用Employee类中的实现,而不是对象类中的实现。我肯定有几十个副本,这就是我没有回答的原因。“行为”是什么,它看起来像是工作的,直到你在任何地方使用它,实际上取决于合同,然后它就坏了。但我传递的是Employee类型的对象,这不被考虑吗?比如,在方法重写中,它取决于argument@sid在第一步中,只考虑编译时类型。
    E1
    的编译时类型是
    Object
    ,因此只能找到在
    Object
    中声明的方法。您的
    equals(Employee)
    方法在
    Employee
    中声明,因此无法找到它。编译器无法“看到”是否存在
    equals(Employee)
    方法,因为
    E1
    属于编译时类型
    Object
    @sid:No,不考虑它,因为编译时该信息不可用。