2013-05-11 25 views
5

Mam pytanie dotyczące przesłonięcia metody equals w Javie. W mojej książce, mam następujący przykład:Metoda rzutowania równa się

public class Dog{ 
    private String name; 
    private int age; 

public boolean equals(Object obj) { 
    if(!(obj instanceof Dog)) return false; 
    Dog other = (Dog) obj;     ---> confused here 
    if(this.name.equals(other.name) && (this.age == other.age) { 
    return true; 
    } 
    else { 
    return false; 
    } 
    } 
} 

ja nie rozumiem, dlaczego, dlaczego mają do oddania odniesienie do odniesienia Dog. Jeśli to odwołanie nie jest typu Dog, zwracamy wartość false. Dlaczego wszystkie kłopoty z rzuceniem go?

+0

Nie zapomnij o obj == null. I niezwiązane z twoim pytaniem, ale możesz po prostu zwrócić this.name.equals (other.name) && (this.age == other.age) – ssedano

+0

Ponieważ to Equals akceptuje tylko jeden parametr i jest to nadpisanie klasy Dog, więc to jest równe oczekiwaniom obiektu typu Dog. jeśli przekażesz inny typ obiektu, to zawsze zwróci on fałsz, jest to część ekstremalnego programowania, która ma na celu uniknięcie wszelkich spodziewanych awarii środowiska wykonawczego. –

+2

Byłoby łatwiej odpowiedzieć na to pytanie, gdybyś mógł zaproponować, w jaki sposób * chcesz * napisać kod bez obsady, pamiętając, że typem kompilacji 'obj' jest' Obiekt'. –

Odpowiedz

5

Podany typ obj to Object, więc należy go przesłać, aby poinformować kompilator, że jest to Dog.

Chociaż logicznie nie może być nic innego w tym miejscu kodu, kompilator nie wie nic o logice - wie tylko o typie.

+0

Prawdę mówiąc, kompilator * może * wiedzieć o tym w tym prostym przypadku. –

+1

@MarkoTopolnik Kompilator może zrobić wiele rzeczy, ale jeden, aby narysować linię gdzieś ... – Bohemian

+2

Rzeczywiście, chociaż różne języki narysować linię różnie. Na przykład na Cejlonie obsada [nie będzie konieczna] (http://ceylon-lang.org/documentation/1.0/tour/types/). – meriton

4

Ponieważ definiujesz własne parametry równości, musisz upewnić się, że są to te same klasy. Oznacza to, że jeśli nie porównujesz ich ze sposobem ==, musisz porównać niektóre wartości wewnątrz obiektów. Aby porównać wartości wewnątrz obiektów, muszą być tego samego typu!

Załóżmy na przykład, że masz dwie wersje: Dog.

Dog dog1 = new Dog("Fido"); 
Dog dog2 = new Dog("Rover"); 

Jeśli chcesz sprawdzić, czy mają taką samą nazwę, jak jestem pewien, że wiesz, nie można używać:

if(dog1 == dog2) 

więc zastąpić metodę równymi. Jednak, ponieważ nadpisujesz go, musi mieć ten sam podpis metody . Sygnatura metody jest zdefiniowana przez nazwę metody oraz liczbę i typ jej parametrów. Oznacza to, że jeśli chcesz go przesłonić, musi mieć parametr typu Object. Stąd:

if(dog1.equals(dog2)) 

Powodem trzeba oddać go użyć dowolnej metody używasz, aby uzyskać wartość name z psem, i porównać te wartości.

Uwaga na projekcie klasy

Konwencja w programowaniu obiektowym, a na pewno w Javie, ma mieć Accessor i Mutator metody GET i zmienić niektóre parametry klasy. Czyli:

dog1.name; ----> dog1.getName(); 

gdzie getName() wygląda następująco:

public String getName() 
{ 
    return name; 
} 
0

jesteś przesłanianie równa metoda, by sprawdzić równość przez valuenie przez reference ..

tj Chcesz dwa psy równe, jeśli mają one takie samename i agenie jeżeli są własnością tej samej osoby (nie, jeśli ich referencje są równe)


Bez obsady nie można uzyskać dostęp psa name i age członkowie

0

Dla JVM nie jest to takie oczywiste ten obiekt to Dog, więc musisz być wyraźnie z obsadą.

0

Ponieważ jako parametr metody obj jest instancja klasy Object.Tak więc w treści metody należy odrzucić obj z powrotem do typu Dog.

0

Właściwości name i age są specyficzne tylko dla Dog. Nie można uzyskać dostępu do name lub age za pomocą obj, która jest Object. Ex poniższy kod wygeneruje błąd czasu kompilacji:

this.name.equals(obj.name) 

ja nie rozumiem, dlaczego, dlaczego mają do oddania odniesienie do odniesienia psa. Jeśli ten odnośnik nie jest typu Dog, zwracamy wartość false. Dlaczego wszystkie kłopoty z rzuceniem go?

Bo chociaż numer referencyjny to Dog, nie oznacza to, że jest to ten sam pies. Nazwa drugiego psa może nie być taka sama jak nazwa twojego psa Dog. Aby porównać name i age z innym Dog z Twoim Dog, należy go najpierw odlać.

0

Myślę, że w klasie demo brakuje metody hashCode(). Te dwa obiekty mogą być równe tylko wtedy, gdy ich wywołanie nadpisanego parametru hashCode() jest równe. (ta sama liczba całkowita).

Jestem prawie pewien, że potrzebujesz obu, aby zagwarantować to równanie.

Powiązane problemy