2014-02-20 30 views
0

我有一个超类Order,它有一个子类OrderBook。 方法在OrderBook中被覆盖。该方法的具体实现如下: -重写Java中的equals(...)方法时遇到问题

public boolean equals(Order o) 
    { 
     if(o==null){ 
      System.out.println("object is null."); 
      return false; 
     } 
     if(o==this){ 
      System.out.println("The object is itself."); 
      return true; 
     } 
     if(o instanceof OrderBook) 
     { 
      OrderBook o1 = (OrderBook)o; 
      if(!(o1.productId.equals(productId))){ 
       System.out.println("productId mismatch."); 
       return false; 
      } 
      if(!(o1.customerId.equals(customerId))){ 
       System.out.println("customerId mismatch."); 
       return false; 
      } 
      if(o1.book!=book){ 
       System.out.println("book mismatch."); 
       return false; 
      } 
     } 
     return true; 
    } 

我遇到了一个意外的输出,如果我给下面的语句: -

Order order1 = new OrderBook("Algorithms","Kunal",false); 
Order order2 = new OrderBook("Algorithms","Kunal",false); 
System.out.println(order1.equals(order2)); 

应该显示true但其显示false。另外,如果我将equals(...)中的参数更改为Object o,那么整个程序运行没有任何问题。

我的疑问是,为什么我们在使用Object时应该使用Order

+2

你实际上不重写'equals'。因为Object类中的'equals'具有不同的签名。 '公共布尔等于(对象o)' – ferrerverck

+0

如果您正在覆盖,你overring父类的方法。这是重载你正在尝试做的方法。 – Zeus

回答

4
public boolean equals(Order o) 

应该是

public boolean equals(Object o) 

Ex平面

这是因为你试图重写一个方法。当你重写一个方法时,你需要匹配的签名。签名是由:

  • 方法
  • 类型的参数
  • 的参数
  • 的返回类型的数名。

原始方法签名中参数的类型为Object,但您提供了Order类型的对象。因此,运行时将处理这些是两种不同的方法。

+0

谢谢。但是当我声明 'Order order1 = new OrderBook(“Algorithms”,“Kunal”,false);' 'Order order2 = order1;' 'System.out.println(order1.equals(order2)); ' 为什么我得到真正的? – kusur

+0

你是否改变了方法签名以匹配'equals(Object o)'?如果你有,你传递同一个对象到'equals'方法,并在你的代码,你的状态,如果对象是相同的,打印出“同一个对象”,并返回TRUE;。 – christopher

+0

不需要。这是在将参数更改为“Object o”之前。 – kusur

1

尝试把这个而不是在你的书比较块部分

if(!o1.book.equals(book)){ 
     System.out.println("book mismatch."); 
     return false; 
} 

,并改变它应该是平等的(对象o) 另外不要忘了@Override注释签名

1

要重写Java中的方法,您必须完全匹配其签名。的Object#equals签名是:

public boolean equals(Object o) 

比较规范的做法是压倒一切等于是:

public boolean equals(Object o) { 
    if (obj == null) 
     return false; 
    if (obj == this) 
     return true; 
    if (!(obj instanceof Order)) 
     return false; 

    // specific comparisons for your Order object 
} 
0

每个人都做得很好地名释义如何使其发挥作用。我想解释为什么你的没有工作:(密切关注equals()中的参数类型)

对象类有equals(Object ojb)。当JVM遇到“order1.equals(order2)”语句时,它自己说:嗯......订单是Order类型的,并且引用了OrderBook。如果OrderBook有一个,我需要使用overriden equals()方法。党!OrderBook不具有equals(Object),而是具有equals(Order)。所以我将使用Object类中的equals(Object)。

你有什么叫做重载。不是压倒一切。