当我学习java时,我发现如果我的类的实例具有可比性,我应该重写equals()(在类Object
中定义)方法,以确定我的类中的两个对象是否有意义相等.Probaby是一个属性实例可以用来比较
对于传递给equals()方法的leagal override参数,必须是Object类型。例如。
class Moof {
private int moofValue;
Moof(int val) {
moofValue = val;
}
public int getMoofValue() {
return moofValue;
}
public boolean equals(Object o) { // Line-1
if ((o instanceof Moof) && (((Moof)o).getMoofValue()
== this.moofValue)) {
return true;
} else {
return false;
}
}
我称之为
Moof one = new Moof(8);
Moof two = new Moof(8);
if (one.equals(two)) {
System.out.println("one and two are equal");
}
如果我使用public boolean equals(Moof o)
,则在第1行,它将不再是重写方法&成为一个重载的方法。但它会改变任何预期的功能吗?为什么建议使用Object
作为equals中的参数,使用正在比较对象的类本身会有什么危害吗?
我可以想到的一个原因是,如果有人称之为one.equals((Object)two))
它会调用对象的等于方法而不是我们的等于。但是为什么有人会这样称呼呢?
答案 0 :(得分:2)
所有的收藏品都会这样称呼它。假设你有一个Moofs列表。该列表是一个通用类。它甚至不知道它存储的对象的类型。因此,如果您尝试测试列表中是否包含moof,您将调用
list.contains(moof)
该列表将调用moof.equals(theObjectStoredAtIndex0)
,moof.equals(theObjectStoredAtIndex1)
等,直到找到相同的列表。列表唯一知道theObjectStoredAtIndex0
的是它是Object类型。因此需要equals()
将Object作为参数。
即使你可能会这样做。假设Moof实现了Baz,而Maaf也实现了Baz。并且假设你想测试baz1是否等于baz2。你会做
if (baz1.equals(baz2))
编译器不知道baz1和baz2的具体类型。它只知道它们都是Object的实例,因此以多态方式调用Moof.equals(Object)
方法。