“让我们为Stamp类实现equals方法。 您需要重写Object类的equals方法。 现在您有一个小问题。 Object类对图章一无所知,因此 它声明了otherObject equals方法的参数变量具有类型 宾语。覆盖该方法时,不允许更改参数变量的类型。“
在这里,它表示不允许我们更改参数变量的类型。 但是,当我使用下面的代码时,它会给我正确的结果。
public class Stamps
{
private String color;
private int value;
public Stamps(String color, int value)
{
this.color=color;
this.value=value;
}
public boolean equals(Stamps other)
{
return color.equals(other.color)
&& value== other.value;
}
}
public class Main
{
public static void main(String[] args)
{
Stamps stamp1 = new Stamps("red",10);
Stamps stamp2 = new Stamps("green",10);
System.out.println(stamp1.equals(stamp2));
}
}
在这里,由于参数类型不同,因此我不会覆盖从Object类继承的equals()方法。因此,与其使用我的代码,不应该使用从Object类继承的代码吗?
答案 0 :(得分:2)
java.lang.Object
equals方法采用一个Object
参数。如果您将其设为Stamp
,就不会覆盖它。
Joshua Bloch告诉您如何在有效Java chapter 3中正确覆盖等于和 hashCode。
严格遵循他的建议。您发布的代码不正确。您甚至都不会尝试hashCode。它们应该成对完成。
答案 1 :(得分:1)
当您使用Java编写方法调用表达式时,将遵循a complex set of rules确定将要调用的方法。
基本上,编译器将搜索它可以找到的最特定的方法,该方法与您尝试传递的参数类型匹配。
这些规则的重要之处在于,它们没有为Object
或任何其他类中的方法做任何特殊规定。 Object
中的方法与您自己定义的任何方法完全一样。
因此,如果您尝试在类equals
的实例上调用Stamps
的方法,并传入Stamps
的单个实例作为参数,它将找到您的方法:
boolean equals(Stamps other)
这比Object
上的内容更具体:
boolean equals(Object other)
(因此,规范中非正式地定义了“更具体”:您可以传递给“更具体”方法的任何参数也可以传递给“不太具体”方法,反之亦然)。
因此Java编译器将选择调用equals(Stamps)
方法。
但是,如果要将变量的第一个或第二个(或两个)声明更改为Object
类型:
Object stamp1 = new Stamps("red",10);
然后将不会调用equals(Stamps)
方法:
Object stamp1
,这是因为Java会在Object
类型中搜索匹配方法。由于equals(Object)
上仅存在Object
,因此这是唯一可以调用的方法。Object stamp2
,这是因为equals(Stamps)
的参数类型不匹配,所以唯一可能调用的方法是equals(Object)
。