gpt4 book ai didi

java - 覆盖父类(super class)的 equals 和 hashcode 方法。我是否为子类做

转载 作者:行者123 更新时间:2023-11-29 03:51:42 26 4
gpt4 key购买 nike

我有一个包含 2 个实例变量的父类(super class)(比如 int aint b)和现在我决定我的子类 int c 中需要一个实例变量。

我重写了父类(super class) equals 和 hashCode 方法来考虑对象/值的相等性。我还覆盖了父类(super class) toString 以提供一个字符串表示对象的状态(变量值)。

基于以上以及我现在在我的子类中有一个实例变量 int c 的事实我想知道我是否

  1. 需要覆盖子类中的 toString 方法,或者这是一个不行不行,因为我在父类(super class)中有一个有效的可继承 toString 方法(已经被覆盖),可用于子类字符串表示?
  2. 需要覆盖子类中的equals 方法。这可以做到吗通过调用父类(super class) equals 方法并在调用后为我的子类实例变量添加比较代码,还是需要新的实现?我认为是后者?
  3. 我打算覆盖子类中的 hashCode 方法。再一次,最好有一个新的实现而不是调用父类(super class)的 hashCode 方法吗?我本来打算将子类 equals 方法中的 a、b 和 c 与另一个对象进行比较,并在子类 hashCode 方法中为 a b 和 c 创建哈希码?这是要走的路还是要求我只考虑子类 equals 和 hashcode 方法中的变量 c?

我查看了各种资源,包括 bloch 的 Effective Java(第 3 章),但找不到上述问题的答案

最佳答案

这个答案假设你的类(class)是这样的:

public class MySuperClass {
int a,b;
}

public class MySubClass extends MySuperClass {
int b;
}

首先,您对 toString() 的评论与主要问题无关。在任何情况下,您的代码 都不应依赖 toString 实现 - 它的输出仅供人类使用。但是请随意使用 super impl:

public String toString() {
return super.toString() + ", c=" + c;
}

其次,equals() 应该比较对象的(已发布)状态。由于子类有另一个字段,它需要自己的 equals()。但是,您可以使用父类(super class)的 equals() 方法,如下所示:

public boolean equals(Object o) {
// The super equals() will compare int a and int b for us
if (!super.equals(o)) {
return false;
}
// super thinks it is equal, so let's compare int c
return o instanceof MySubClass && ((MySubClass)o).c == c;
}

第三,hashcode 应该与 equals 对齐,所以也要实现它。同样,您可以使用 super 的 impl 来散列 a 和 b:

public int hashcode() {
return super.hashcode() + new Integer(c).hashCode(); // for example
}

关于java - 覆盖父类(super class)的 equals 和 hashcode 方法。我是否为子类做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8482906/

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