2013-07-09 3 views
5

Ich habe ein Programm, das Zoo ist und im Zoo gibt es verzweigte Untergruppen von Tieren, die Reptilien sind. Wenn ich eine equals-Methode mache, kompiliert das Hauptprogramm und es läuft. Ich bin verwirrt, wie Java weiß, die equals-Methode zu verwenden, wenn ich Objekte und nicht spezifisch int oder String vergleiche?Funktioniert die equals-Methode mit Objekten? Wenn das so ist, wie?

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

} 

Antwort

11

Sie überschreiben nicht die Methode Object#equals, sondern überladen sie. In Ihrer Methode Deklaration verwenden Sie Animal Art statt Object:

public boolean equals(Animal other) 

Ein gutes Überfahren des Verfahrens würde mit dem instanceof Operator. Ein Beispiel zeigt:

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

Mehr Informationen zum Thema:

+0

+1 Für ;-) erste und korrekt zu sein. –

+0

PS. Eine gute Overriding-Methode sollte ebenfalls kommentiert werden ;-). –

+0

@LuiggiMendoza Upvote für sehr sehr schnell und richtig –

2

Für Ihre Frage, wie Java weiß, wie Objekte zu vergleichen, Sie müssen überschreiben Sie die equals-Methode

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

    } 

Während des Vergleichs wird die equals-Methode verwendet. Sie können sich dieses gute Tutorial ansehen, das die Bedeutung der equals-Methode erklärt.

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

Auch nur überwiegende gleich ist nicht genug, wenn Sie Objekte in Sammlungen jene Verwendung Hashing verwenden. Sie lautlos ein gutes Tutorial auf

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

+0

Objekt hat keine Mitgliedergröße. –

+0

Ja, Sir, bearbeitet es :) –

+0

+1 für die Erwähnung überschreiben Hashing, würde ich aber sagen, dass der Hash sollte immer überschrieben werden, wenn der Gleichgestellte überschrieben wird, sonst ist der Vertrag gebrochen. Eine gute IDE erzeugt den neuen Hash für Sie –

0

Jede Klasse erbt die Object Klasse finden. Und die Object Klasse hat eine equals Methode. Also, wenn jede Klasse nicht die Methode equals enthebt dann wird es die Standardimplementierung verwenden Object.equals.

Vom doc

Die Methode equals für Object-Klasse implementiert die anspruchsvollsten möglich ¨Aquivalenzrelation auf Objekte; das heißt, für alle Nicht-Null-Referenzwerte x und y liefert diese Methode true, wenn und nur wenn sich x und y auf dasselbe Objekt beziehen (x == y hat den Wert true).

Aus dem Quellcode Object.equals

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

So Wenn irgendein Objekt nicht seine eigene Implementierung von equals dann der equals Methode wird einfach überprüfen, ob die Objektreferenz gleich ist oder nicht.

erhalten also ein gewünschtes Ergebnis aus gleich Sie von Ihrer eigenen implementieren müssen als alread in anderer Antwort vorgeschlagen

Verwandte Themen