gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:33:08 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com