重载时 equals 方法的行为如何?
How equals method behaves when overloaded?
所以我有下面的测试代码实现
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 语句验证了相同)。
您对绑定如何完成的理解不正确。
绑定分为两步:
- 决定调用哪个重载
- 决定调用哪个实现。
第一步是在编译时完成的,根据变量的compile-time类型。第二步在运行时完成,并基于对象的运行时类型。第二步就是你所说的"polymorphism".
在第一步中,E1
的编译时类型是Object
,所以equals
只有一个overload选择 - 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
class,returns 一直都是假的。
所以我有下面的测试代码实现
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 语句验证了相同)。
您对绑定如何完成的理解不正确。
绑定分为两步:
- 决定调用哪个重载
- 决定调用哪个实现。
第一步是在编译时完成的,根据变量的compile-time类型。第二步在运行时完成,并基于对象的运行时类型。第二步就是你所说的"polymorphism".
在第一步中,E1
的编译时类型是Object
,所以equals
只有一个overload选择 - 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
class,returns 一直都是假的。