我被赋予重写Java中equals方法的任务,并且我想知道我提供的两个示例是否可以完成相同的事情。如果是这样,它们之间有什么区别。
public class Animal {
private int numLegs;
public Animal(int legs) {
numLegs = legs;
}
public boolean equals(Object other) {
if(other == null) return false;
if(getClass() != other.getClass()) return false;
return this.numLegs == ((Animal)other).numLegs;
}
public class Animal {
private int numLegs;
public Animal(int legs) {
numLegs = legs;
}
public boolean equals(Object other) {
//check if other is null first
if(other == null) return false;
//Check if other is an instance of Animal or not
if(!(other instanceof Animal)) return false;
//// typecast other to Animal so that we can compare data members
Animal other = (Animal) other;
return this.numLegs == other.numLegs;
}
答案 0 :(得分:5)
他们不一样。
对于第一个实现,只有两个比较的实例都属于同一类(例如,如果两个都是true
实例,并且假设Cat
扩展了{ {1}}。
对于第二种实现,您可以将Cat
与Animal
进行比较,并且仍然得到Cat
,因为这两个实例都是Dog
的实例,并且支路数相同
如果没有true
类的子类,它们的行为将相同,因为在这种情况下,如果Animal
是Animal
getClass()== other.getClass( )other instanceof Animal
是`。
P.S。,第二个代码段有错别字,因为您要重新声明true,
变量:
is also
您可能打算使用其他变量名。
答案 1 :(得分:2)
对于Animal
的子类,他们做的事情不同;例如,如果您有一个扩展Dog
的类Animal
和一个实例dog
,则调用animal.equals(dog)
将返回第一个版本的false
和{{1} }和第二个。
答案 2 :(得分:1)
它们是不同的:
情况1:如果实例属于同一类,例如true
和Cow extends Animal
,则此检查将始终返回Cat extends Animal
。
情况2:在这种情况下,如果两个都是Animal的实例并且支路数相同,则返回true。