equals方法是否适用于对象?如果是这样,怎么样?

时间:2013-07-09 14:46:25

标签: java object comparison object-comparison

我有一个动物园的计划,在动物园里有分支的亚群动物是爬行动物。当我做一个equals方法时,主程序编译并运行。我很困惑,如果我比较对象而不是特定的int或String,java知道如何使用equals方法?

public class Zoo {

    public static void main(String[]args) {
        Animal a=new Animal("Bob");
        Reptile komodo= new Reptile("Snakey");
        komodo.bask();
        a.size=3;
        komodo.size=5;
        System.out.println(a);
        System.out.println(komodo);
        Turtle t= new Turtle("Slowy");
        t.hide();
        t.size=6;
        t.numlegs=4;
        System.out.println(t);
        System.out.println(t.equals(komodo));
    }
}

public class Animal {
    public String name;

    public boolean equals(Animal other) {
        return other.size==this.size;
    }

    public Animal(String s) {
        name=s;
    }
    public void setName(String n) {
        this.name=n;
    }
    public void eat(String meal) {
        System.out.println("chump chump yummy "+meal);
    }
    public int size;

    public String toString() {
        return "I am "+name+" and I'm "+size+" cm long";
    }

}

public class Reptile extends Animal {

    public Reptile(String n) {
        super(n);
        numlegs=0;
    }
    public Reptile(String n, int l) {
        super(n);
        numlegs=l;
    }

    public void bask() {
        System.out.println("basking...");
    }
    public String toString() {
        return super.toString()+numlegs+" legs";
    }

    public int numlegs;
}
public class Turtle extends Reptile {

    public Turtle(String n) {
        super (n,4);
        shellColor="Brown";
    }
    public void hide() {
        System.out.println("you cant see me");
    }
    public String toString() {
        return super.toString()+" and my shell is"+ shellColor;
    }
    public String shellColor;

    public void bask() {
        super.bask();
        System.out.println("turtle is basking...");
    }

}

3 个答案:

答案 0 :(得分:11)

您没有覆盖Object#equals方法,而是重载它。在您的方法声明中,您使用Animal类型而不是Object

public boolean equals(Animal other)

该方法的优先覆盖是使用instanceof运算符。显示一个例子:

@Override
public boolean equals(Object other) {
    if(other instanceof Animal) {
        Animal otherAnimal = (Animal)other;
        //comparison logic...
    }
    return false;
}

有关该主题的更多信息:

答案 1 :(得分:2)

关于java如何比较对象的问题, 你需要覆盖equals方法

 public boolean equals(Object other){
    // return true or false based on your logic

  }

在比较时,使用equals方法。 你可以看看这个很好的教程,它解释了equals方法的重要性。

http://www.thejavageek.com/2013/06/26/what-is-the-significance-of-equals-method-in-java/

此外,如果您将对象用于使用散列的集合,则仅覆盖equals是不够的。你会在

找到一个很好的教程

http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/

答案 2 :(得分:0)

每个类都默默地继承Object类。 Object类有一个equals方法。因此,如果任何类不覆盖equals方法,那么它将使用Object.equals.

的默认实现

来自doc

  

类Object的equals方法实现最具辨别力   对象可能的等价关系;也就是说,对于任何非null   引用值x和y,当且仅当x时,此方法返回true   和y引用相同的对象(x == y的值为true)。

来自Object.equals的源代码

public boolean equals(Object obj) {
    return (this == obj);
}

因此,如果任何对象没有自己的equals实现,那么equals方法将只检查对象引用是否相同。

所以从平等中获得所需的结果,你需要自己实现,如同在其他答案中建议的那样