覆盖Object类的相等方法

时间:2013-07-21 18:34:21

标签: java object override equals

好的,所以我们假设您有两个课程:ClassAClassB

  • ClassA延伸ObjectClassB延伸ClassA
  • ClassA没有参数构造函数
  • ClassB有一个整数变量x和一个带有整数参数的构造函数,用于初始化x
  • ClassA不会覆盖equals继承自Object
  • ClassB
  • equals会覆盖ClassB,因此如果整数x在两个对象中具有相同的值,则 //In Class B you have this method: public boolean equals (Object obj) { if (obj == null) { return false; } if (obj.getClass() != this.getClass()) { return false; } if (!super.equals(obj)) { return false; } B b = (B) obj; return this.x == b.x; } 的两个对象被视为相等。

        B b1 = new B(1);
        B b2 = new B(1);
        System.out.println(b1.equals(b2));
    

主要是你要运行这段代码

B

我相信会打印出“假”,但我正在努力理解为什么。也许我并没有完全理解覆盖的概念,但我只是认为,因为Object.equals应该覆盖{{1}}方法,所以它可以确保x字段是相同的。

我错过了哪些“错误”?

2 个答案:

答案 0 :(得分:6)

你应该省略

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

因为那将使用默认的equals()方法(检查对象标识)

答案 1 :(得分:2)

你的代码永远不会超过super.equals检查,因为(因为Object.equals正在比较对象引用),任何两个不同的对象总是会测试false是否相等。 Object.equals正在比较引用,它返回true的唯一时间是它是否将引用与自身进行比较。

通常,如果你重写equals,那是因为你想按值比较对象(比如String或BigInteger),所以在这种情况下没有理由引用超类的equals方法(通过引用进行比较)。 p>