FabioJ ha scritto:
Pero' devo dire che non ho ancora capito in questo esercizio perche' viene utilizzato il public boolean.
Il metodo in java.lang.Object è:
public boolean equals(Object obj)
E per le regole del overriding, in una sottoclasse DEVE restare esattamente così (a parte il nome del parametro, che è arbitrario).
Non puoi restringere il livello di accesso, non puoi cambiare il tipo di ritorno, non puoi dichiarare eccezioni checked e non puoi nemmeno cambiare il tipo del parametro (altrimenti fai un overload ... non un ovverride).
In una sottoclasse deve restare dichiarato così.
FabioJ ha scritto:
Ripeto la teoria la conosco abbastanza e so che avrò un ritorno false o true pero' vorrei procedere in bicicletta e non con un GoKart.
Scusate questo esempio cretino della bicicletta e il Kart pero' logicamente le seguenti istruzioni cosa fanno:
Se o.getClass() e' diverso da ????? perche' si scrive l'istanza .....this.getClass() ritorna false altrimenti .....return etc...
In poche parole , cosa succede
Ok, facciamo un esempio più semplice:
class Persona {
private final String nome;
public Persona(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
}
Il equals posso implementarlo in almeno due modi: usando instanceof per il test o usando il test sulle classi:
a)
public boolean equals(Object obj) {
if (obj instanceof Persona) {
Persona altraPersona = (Persona) obj;
return nome.equals(altraPersona.nome);
}
return false;
}
b)
public boolean equals(Object obj) {
if (obj != null && obj.getClass() == getClass()) {
Persona altraPersona = (Persona) obj;
return nome.equals(altraPersona.nome);
}
return false;
}
La differenza è nel test che VA sempre fatto prima nel equals.
L'operatore instanceof rispetta la ereditarietà, verifica se l'oggetto soddisfa la condizione IS-A ("è-un") Persona. Se io facessi una sottoclasse
class Studente extends Persona { ..... }
e faccio
Persona unaPersona = new Persona("Mario");
Studente unoStudente = new Studente("Mario");
if (unaPersona.equals(unoStudente))
la condizione con instanceof è soddisfatta (e equals darà true poiché i nomi sono uguali), infatti un oggetto Studente è-un Persona.
Mentre invece con il test delle classi con getClass() il test è molto più stretto. Per ogni classe definita in Java c'è un corrispondente
oggetto di tipo java.lang.Class associato.
Il class di Persona è un certo oggetto Class, il class di Studente è un ALTRO oggetto Class. Quindi confrontando i Class, il test è molto rigido e NON rispetta la ereditarietà. Un oggetto di classe Studente NON ha il Class di Persona quindi il test fallisce (e farà il return false).