覆盖Java中的equals(...)方法时出现问题

时间:2014-02-20 21:42:13

标签: java inheritance override

我有一个超类Order,它有一个子类OrderBookequals(...)中会覆盖OrderBook方法。方法实现如下: -

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

4 个答案:

答案 0 :(得分:4)

public boolean equals(Order o)

应该是

public boolean equals(Object o)

<强>解释

这是因为你试图覆盖一个方法。覆盖方法时,需要完全匹配签名 。签名由以下内容组成:

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

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

答案 1 :(得分:1)

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

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

并更改应该等于的签名(对象o) 另外不要忘记@Override注释

答案 2 :(得分: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
}

答案 3 :(得分:0)

每个人都很好地解释了如何使其发挥作用。我想解释为什么你的工作不起作用:(密切注意equals()中参数的类型)

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

你所拥有的称为OVERLOADING。没有压倒一切。