1

好的,假设您有两个课程: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方法,以便确保 x 字段相同。

我缺少什么似乎是“错误的”?

4

2 回答 2

6

你应该省略

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

因为这将使用默认的 equals() 方法(检查对象身份)

于 2013-07-21T18:37:43.370 回答
2

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

通常,如果您覆盖 equals 是因为您想按值比较对象(如 String 或 BigInteger),因此在这种情况下没有理由引用超类的 equals 方法(按引用比较)。

于 2013-07-21T18:42:30.547 回答