我有一个超类Order
,它有一个子类OrderBook
。 equals(...)
中会覆盖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
?
答案 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。没有压倒一切。