【问题标题】:Does the equals method work with objects? If so, how?equals 方法是否适用于对象?如果是这样,怎么做?
【发布时间】:2013-07-09 14:46:24
【问题描述】:

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

}

【问题讨论】:

    标签: java object comparison object-comparison


    【解决方案1】:

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

    有关该主题的更多信息:

    【讨论】:

      【解决方案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/

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

      找到一个很好的教程

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

      【讨论】:

      • 对象没有成员大小。
      • +1 用于提及覆盖哈希,但我想说的是,如果等于被覆盖,则哈希应该始终被覆盖,否则合同被破坏。一个好的 IDE 会为你生成新的哈希
      • @RichardTingle 是的,先生,我已经在我提供的教程中提到了所有这些要点。如果您查看它并提供反馈,它将帮助我改进。那将不胜感激
      • @RichardTingle IDE 只会调用 super.hashCode() 所以不管 IDE 有多好,hashCode 的自动生成实现是不对的 =\
      • @LuiggiMendoza 我的 IDE (netbeans) 允许您单击有关不覆盖哈希码的警告消息并选择“生成哈希码”,然后选择要用于哈希的字段并自动生成它
      【解决方案3】:

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

      来自doc

      Object类的equals方法实现了最具辨别力的 对象上可能的等价关系;也就是说,对于任何非空 参考值 x 和 y,当且仅当 x 和 y 指的是同一个对象(x == y 的值为 true)。

      来自Object.equals的源代码

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

      所以如果任何对象没有自己的 equals 实现,那么 equals 方法将简单地检查对象引用是否相同。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-02
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 2011-03-15
        相关资源
        最近更新 更多