5

我有一个程序是动物园,在动物园里有爬行动物的分支动物亚群。当我执行 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...");
    }

}
4

3 回答 3

11

您不是覆盖该Object#equals方法,而是重载它。在您的方法声明中,您使用Animaltype 而不是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;
}

有关该主题的更多信息:

于 2013-07-09T14:49:17.043 回答
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/

于 2013-07-09T14:50:02.760 回答
0

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

文档

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。

来自 Object.equals 的源代码

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

因此,如果任何对象没有自己的 equals 实现,则该equals方法将简单地检查对象引用是否相同。

因此,从 equals 中获得所需的结果,您需要按照其他答案中的建议自行实施

于 2013-07-09T14:55:25.437 回答