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

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

您没有覆盖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; } 

有关该主题的更多信息:

  • 关于平等的最佳做法:过载还是不过载?
  • 覆盖Object.equals VS重载它

有关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/

每个类都以静默方式inheritanceObject类。 Object类有一个equals方法。 因此,如果任何类不重写equals方法,那么它将使用Object.equals.的默认实现Object.equals.

从文档

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

来自Object.equals的源代码

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

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

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