Работает ли метод equals с объектами? Если так, то как?

У меня есть программа зоопарка, и в зоопарке есть разветвленные подгруппы животных, которые являются рептилиями. Когда я делаю метод equals, основная программа компилируется и запускается. Я запутался, как Java знает, как использовать метод equals, если я сравниваю объекты, а не конкретно int или String?

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 ответа

Вы не переопределяете 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;
}

Больше информации по теме:

На ваш вопрос о том, как 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/

Каждый класс наследует Object класс молча. И Object класс имеет equals метод. Поэтому, если какой-либо класс не переопределяет метод equals, он будет использовать реализацию по умолчанию Object.equals.

Из документа

Метод equals для класса Object реализует максимально различающее возможное отношение эквивалентности на объектах; то есть для любых ненулевых ссылочных значений x и y этот метод возвращает true, если и только если x и y ссылаются на один и тот же объект (x == y имеет значение true).

Из исходного кода Object.equals

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

Так что если у какого-либо объекта нет собственной реализации equals, тогда equals Метод просто проверяет, является ли ссылка на объект той же или нет.

Так что получите желаемый результат из равных, которые вам нужно реализовать самостоятельно, как уже было предложено в другом ответе

Другие вопросы по тегам