重写从Object继承的equals方法

时间:2018-11-27 07:30:27

标签: java

我被赋予重写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;
    }

3 个答案:

答案 0 :(得分:5)

他们不一样。

对于第一个实现,只有两个比较的实例都属于同一类(例如,如果两个都是true实例,并且假设Cat扩展了{ {1}}。

对于第二种实现,您可以将CatAnimal进行比较,并且仍然得到Cat,因为这两个实例都是Dog的实例,并且支路数相同

如果没有true类的子类,它们的行为将相同,因为在这种情况下,如果AnimalAnimal 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:如果实例属于同一类,例如trueCow extends Animal,则此检查将始终返回Cat extends Animal

情况2:在这种情况下,如果两个都是Animal的实例并且支路数相同,则返回true。