java - 重写父类(super class)或子类中的 equals 和 hashCode 方法,或者重写两者

标签 java equals hashcode

我对 Java 编程比较陌生,并且在查找在哪里使用时遇到了问题 当我有一个从父类(super class)继承的子类时, equals 和 hashcode 方法会被重写。

我想检查父类(super class)和子类的对象是否相等,并且想知道父类(super class)和子类中的一个或两个是否需要重写它们的 equals 和 hashcode 方法?

我的子类没有实例变量,我的父类(super class)有 2 个实例变量(整数)

我的子类构造函数正在调用父类(super class)构造函数。

如果我想重写子类的 equals 和 hashcode 方法,基于子类没有实例变量但从其父类(super class)继承了 2 个实例变量的事实是否可能?

最佳答案

这实际上提出了一个棘手的问题。假设您有一个 Foo 类和两个子类 FooA 和 FooB。 在您的应用程序/域中,FooA 等于 Foo 或 FooB 有意义吗?

如果是这样,您应该在父类(super class)中实现 equals。并测试 instanceof Foo。基本上,在 FooA 或 FooB 中添加的任何额外字段都将被忽略。通常这是正确的。代码如下:

public boolean equals(Object o) {  // perfectionists will make this final
  if (this == o)
     return true;
  if (o instanceof Foo) {  // note that Foo, FooA and FooB would all pass
     Foo oFoo = (Foo)o;
     // compare all the fields of Foo here
  }

  return false;
}

如果没有,则需要在子类中实现 equals。并测试类是否相等,而不仅仅是instanceof。例如

public boolean equals(Object o) {
  if (this == o)
     return true;
  if (o == null)  // this extra check is needed to avoid a NPE
    return false;
  if (o.getClass() == this.getClass()) {  // must be an exact match
     FooA oFoo = (FooA)o;
     // compare all the fields here
  }

  return false;
}

总的来说,我认为大多数人都使用第一种方法。这似乎最适合您的问题。请参阅 Josh Bloch 的《Effective Java》。您会发现很多关于此的帖子,例如Any reason to prefer getClass() over instanceof when generating .equals()?

关于java - 重写父类(super class)或子类中的 equals 和 hashCode 方法,或者重写两者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8477682/

相关文章:

java - 如何为精度有限的 double 值编写正确的哈希码方法?

java - 如何搜索数组列表/多态数组的数组列表

perl - 在一行 Perl 中执行多个 +=

c# - 用字典覆盖对象的等于。 C#

java - java中两个整数值相等?

java - 如何为排列编写好的 hashCode()?

java - 为了在集合中添加一个对象,是否有必要同时覆盖 equals 和 hashcode。?

java - 更高效还是更现代?使用 Java 读取和排序文本文件

java - 如何检查特定的 Windows 服务正在运行

将字段设置为 null 时 Java Null Dereference - Fortify