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

标签 java overriding subclass equals

我有一个名为“worker”的子类,扩展了“Person”类。我正在尝试覆盖“Worker”子类中“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;
        }
    }
}

最佳答案

您已经正确地机械地处理了覆盖部分,但是您的 Employee 类的 equals 方法永远不会返回 true。

首先是因为:

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

即使 super.equals 的结果为真,你也总是会最终返回 false。

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

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

关于java - 如何使用继承覆盖 equals() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35642638/

相关文章:

java - 重写 Hashtable.contains() java 时出现 StackOverflowError

java - 用静态方法调用子类

python - 使用 uic.loadUI() 重新定义(覆盖)PyQt5 中的方法

c# - 如何在 C# 中干净地设计并行继承结构?

java - 如何对在其 builder() 方法中使用静态单例工厂的构建器进行单元测试?

java - Spring DI 与构造函数

java - 可打包对象中的数组列表

oop - 在 MATLAB 中覆盖父类(super class)方法和访问修饰符

java - 使用 Hibernate 在 MySQL 上将 TIMESTAMP 复制到 DATETIME

java - 如何重写方法