2013-07-09 12 views
5

Mam program, który jest zoo i w zoo są rozgałęzione podgrupy zwierząt, które są gady. Kiedy robię metodę równą, główny program kompiluje się i działa. Jestem zdezorientowany, jak java wiedzieć, aby użyć metody równości, jeśli porównuję obiekty, a nie konkretnie int lub String?Czy metoda równań działa z obiektami? Jeśli tak to jak?

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

} 

Odpowiedz

11

Nie jesteś przesłanianie metody Object#equals, ale przeładowanie go. W swojej deklaracji metody użyć Animal typ zamiast Object:

public boolean equals(Animal other) 

Dobrym nadrzędnym metody byłyby za pomocą operatora instanceof. Ilustrujący przykład:

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

Więcej informacji na ten temat:

+0

+1 Za to, że pierwszy i poprawna ;-). –

+0

PS. Dobra nadrzędna metoda powinna być również opisana. ;-). –

+0

@LuiggiMendoza upvote za bycie bardzo bardzo szybkim i poprawnym –

2

za pytanie w jaki java umie porównać obiekty, trzeba zastąpić metodę równań:

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

    } 

Podczas porównywania używana jest metoda równa. Możesz rzucić okiem na ten dobry samouczek, który wyjaśnia znaczenie metody równości.

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

Również tylko nadrzędnym jest równa nie wystarczy, jeśli używasz tych obiektów do kolekcji hashowania użytkowania. Znajdziecie dobry tutorial na

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

+0

Obiekt nie ma rozmiaru członka. –

+0

Tak, sir, zredagowałem to :) –

+0

+1 za wzmiankę o nadpisywaniu hashowania, powiedziałbym jednak, że hash powinien być zawsze nadpisany, jeśli równe wartości są nadpisane, w przeciwnym razie umowa zostanie zerwana. Dobry IDE wygeneruje nowy skrót dla ciebie –

0

Każda klasa dziedziczy klasę Object cicho. Klasa Object ma metodę equals. Więc jeśli klasa nie przesłonić metodę equals następnie użyje realizację domyślnej Object.equals.

Z doc

równości metoda obiekt klasy implementuje najbardziej wymagających możliwą relację równoważności na obiektach; to znaczy, dla dowolnych niezerowych wartości referencyjnych xiy, ta metoda zwraca wartość true wtedy i tylko wtedy, gdy x i y odnoszą się do tego samego obiektu (x == y ma wartość true).

z kodu źródłowego Object.equals

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

więc jeśli obiekt nie posiada swój własny realizacja równych wówczas metoda equals po prostu sprawdzić, czy odwołanie do obiektu jest taka sama, czy nie.

Więc uzyskać pożądany rezultat od równa trzeba zaimplementować według własnego alread jak zasugerowano w drugiej odpowiedzi

Powiązane problemy