在子类中调用super.equals和super.hashCode?

时间:2012-04-20 21:21:57

标签: java equals hashcode

如果我在父类和子类中实现equals()hashCode(),是否有必要在子类中的super.equals()中调用equals(),例如

public boolean equals(Object obj) {

  if (obj.getClass() != ChildClass.class) {
    return false;
  }

  return super.equals() && this.var == ((ChildClass) obj).var;

}

我假设父类不是Object,并且给出了equals和hashCode的正确定义。

2 个答案:

答案 0 :(得分:8)

不,这不是必要的,也可能是错的。实际上,你覆盖equal的部分原因是因为super.equals没有给出正确的行为(对吧?)。

或换句话说,如果super.equals给出了正确的行为,您可能不需要去覆盖它。

但如果你要覆盖equals,那么是的,你也需要覆盖hashCode

答案 1 :(得分:2)

如果你的超类没有实现equals,那么调用super.equals会得到Object实现,它只比较引用,所以在任何正常的equals实现中你要比较一个业务键,它实际上会导致很多假阴性。

也就是说,上面的实现在语义上与Object中的默认等效实现没有任何不同,因为您只是使用==进行比较。

至于hashCode,如果你重写equals,你真的应该覆盖hashCode以保持两者的契约。例如,如果您使用等于的业务键,则应该对哈希码使用相同的业务键,以便两个相等的对象生成相同的哈希码。