2013-07-21 31 views
1

行,所以让我们说,你有两个类:ClassAClassB重写Object类平等法

  • ClassA延伸ObjectClassB延伸ClassA
  • ClassA无参数的构造函数
  • ClassB有整数变量x和带初始化整数参数的构造函数x
  • ClassA不会覆盖equals,它的从Object
  • ClassB覆盖equals inhering,这样的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字段是相同的。

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

+2

如果你正在返回'super.equals()'返回的值,重写'equals'有什么意义? –

+0

1)对代码块使用一致的逻辑缩进。代码的缩进旨在帮助人们理解程序流程。 2)为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

回答

6

你应该忽略

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

,因为这将使用默认的equals()方法(其中检查对象标识)

2

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

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