如何使用继承覆盖 equals() 方法?

How can I override equals() method using inheritance?

我有一个名为 "worker" 的子 class 扩展了 "Person" class。我试图在 "Worker" 的 subclass 中覆盖 "Person" 中的 equals() 方法。谁能解释我的尝试在基本覆盖方面是否正确?

public class Person {
    private String name;
    public Person(String n) {
        name = n;
    }
    public Person() {
        this("");
    }
    public String getName() {
        return name;
    }
    public String toString() {
        return getName() + " ";
    }
    public boolean equals(Object rhs) {
        if (!(rhs instanceof Person)) {
            return false;
        }
        Person other = (Person) rhs;
        return this.getName().equals(other.getName());
    }
    class Employee extends Person {
        double salary;
        public Employee(double b) {
            salary = b;
        }
        Employee() {
            salary = 150000;
        }
        public double getSalary() {
            return salary;
        }
        @Override
        public String toString() {
            return super.toString();
        }
        // my attempt
        @Override
        public boolean equals(Object rhs) {
            if (rhs == null) {
                return false;
            }
            if (getClass() != rhs.getClass()) {
                return false;
            }
            if (!super.equals(rhs))
                return false;
            else {
            }
            return false;
        }
    }
}

您已经正确地机械地处理了覆盖部分,但是您的员工 class 的 equals 方法永远不会 return 正确。

首先是因为:

  if (!super.equals(rhs)) return false; else { }

即使 super.equals 的结果为真,你也总是会落入最后的 return 假。

一旦你解决了这个问题,Person 的 equals 方法仍然有问题。如果您传入 Worker 的实例,则该 equals 方法将始终 return false。

可能还有其他的东西,但这两个是表演障碍。

NetBeans使用快捷键alt+insert,可以自动生成equals方法、constructors、getters、setters、delegate方法等。如果你想使用使用编码混合(Hashtable,HashMap,HashSet)的集合,它重新定义等于你还必须重新定义 hashCode()。