2013-07-09 13 views
5

Ho un programma che è zoo e nello zoo ci sono sottogruppi ramificati di animali che sono rettili. Quando eseguo un metodo equals, il programma principale viene compilato e viene eseguito. Sono confuso in che modo java sa utilizzare il metodo equals se sto confrontando gli oggetti e non specificamente int o String?Il metodo equals funziona con gli oggetti? Se é cosi, come?

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..."); 
    } 

} 

risposta

11

Non si sta eseguendo l'override del metodo Object#equals ma lo si sta sovraccaricando. Nella tua dichiarazione di metodo si utilizza Animal tipo invece di Object:

public boolean equals(Animal other) 

Una buona prioritario del metodo sarebbe utilizzando l'operatore instanceof. Che mostra un esempio:

@Override 
public boolean equals(Object other) { 
    if(other instanceof Animal) { 
     Animal otherAnimal = (Animal)other; 
     //comparison logic... 
    } 
    return false; 
} 

Maggiori informazioni sul tema:

+0

+1 per essere primo e corretto ;-). –

+0

PS. Anche un buon metodo prevalente dovrebbe essere annotato. ;-). –

+0

@LuiggiMendoza upvote per essere molto molto veloce e corretto –

2

Per la vostra domanda su come java sa come confrontare gli oggetti, è necessario scavalca il metodo equals

public boolean equals(Object other){ 
    // return true or false based on your logic 

    } 

Durante il confronto, viene utilizzato il metodo equals. Puoi dare un'occhiata a questo buon tutorial che spiega il significato del metodo equals.

http://www.thejavageek.com/2013/06/26/what-is-the-significance-of-equals-method-in-java/

Inoltre, solo imperativo è uguale non è sufficiente se si utilizza oggetti in raccolte quelli uso hashing. Troverete un buon tutorial a

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

+0

L'oggetto non ha dimensioni membro. –

+0

Sì signore, modificato :) –

+0

+1 per menzionare l'hashing overriding, direi comunque che l'hash deve essere sempre sovrascritto se gli uguali sono sovrascritti, altrimenti il ​​contratto è interrotto. Un buon IDE genererà il nuovo hash per te –

0

Ogni classe eredita la classe Object in silenzio. E la classe Object ha un metodo equals. Quindi, se ogni classe non ridefinisce il metodo equals allora userà l'implementazione predefinita di Object.equals.

Dal doc

Il uguale metodo per classe Object implementa la più esigente possibile relazione di equivalenza su oggetti; vale a dire, per qualsiasi valore di riferimento non-zero x e y, questo metodo restituisce true se e solo se x e y si riferiscono allo stesso oggetto (x == y ha il valore true).

dal codice sorgente di Object.equalsQ

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

modo da se alcun oggetto non dispone di un proprio implementazione di uguali allora il metodo equals semplicemente verificare se il riferimento all'oggetto è lo stesso o no.

Quindi ottenere un risultato desiderato da equals è necessario implementare da soli, come suggerito nella alread altra risposta

Problemi correlati