2013-07-09 3 views
5

У меня есть программа, которая является зоопарком, а в зоопарке есть разветвленные подгруппы животных, которые являются рептилиями. Когда я делаю метод equals, основная программа компилируется и запускается. Я смущен, как java знает использовать метод equals, если я сравниваю объекты, а не int или String?Работает ли метод 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..."); 
    } 

} 

ответ

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; 
} 

Более подробную информацию по теме:

+0

+1 За то, что первым и правильно ;-). –

+0

PS. Хороший метод переопределения также должен быть аннотирован. ;-). –

+0

@LuiggiMendoza upvote за то, что очень быстро и правильно –

2

Для вашего вопроса о том, как Java умеет сравнивать объекты, вам нужно переопределить метод равных

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/

+0

Объект не имеет размер члена. –

+0

Да, сэр, отредактировал его :) –

+0

+1 для упоминания хеширования переопределения, я бы сказал, что хэш всегда должен быть переопределен, если равны переопределены, иначе контракт сломан. Хорошая среда IDE создаст новый хеш для вас –

0

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

Из doc

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

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

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

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

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

Смежные вопросы