我有一个动物园的计划,在动物园里有分支的亚群动物是爬行动物。当我做一个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...");
}
}
答案 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
方法将只检查对象引用是否相同。
所以从平等中获得所需的结果,你需要自己实现,如同在其他答案中建议的那样