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,不考虑它,因为编译时该信息不可用。