2011-08-23 13 views
9

Qualcuno può dirmi se questo codice:annotazione @Override

public class OvTester { 
    @Override 
    public int hashCode() { 
     return toString().hashCode(); 
    } 
} 

determina che il metodo toString nella classe OvTester l'override del metodo toString nella sua superclasse.

Mi piacerebbe sapere se questo è vero, e se sì, come funziona?

Se non è vero, allora è vero:

"il metodo hashCode() in OvTester deve avere la priorità lo stesso metodo nome nella sua superclasse"

?

Se ciò non è corretto, allora che cosa è corretto?

+1

La classe non sembra avere una superclasse, quindi questo fallirebbe. – Sirs

+9

ovviamente ha una superclasse - 'java.lang.Object' – Bozho

risposta

13

Metodo prioritario succede quando si ridefinisce un metodo con la stessa firma in un sublcass.

Così qui modo si sostituisce hashCode(), non toString()

Il @Override annotazione è opzionale (ma una cosa molto buona) e indica che questo dovrebbe essere l'override. Se sbagliate qualcosa o avete un parametro errato, il compilatore vi avviserà.

Quindi sì, la seconda affermazione è vera (e la superclasse in questo caso è java.lang.Object)

2

Mi piacerebbe sapere se questo è vero, e se sì, come funziona?

No, non è esattamente vero.

Il @Overrides annotazione dice che "questo metodo l'override del metodo con lo stesso nome nella classe super-".

In questo caso il hashCode di OvTester sovrascrive lo hashCode in Object.

se non è vero, allora è vero: il metodo hashCode() in OvTester deve avere la priorità lo stesso metodo nome nella sua superclasse?

Sì. È esattamente come funziona.


Quando un metodo non fa altro che chiamare un altro metodo (quasi quello che hai nel tuo esempio) di solito è indicato come un delegate method. Forse è questo che stai confondendo con questo.

0

No, significherebbe solo che il metodo hashCode() viene sovrascritto. Il compilatore verificherà al momento della compilazione che hashCode() sia realmente un metodo (con quella firma) che viene sovrascritto.

0

@Override è solo tempo di compilazione controllare se l'implementatore ha la precedenza sul metodo.

se si tenta l'override

@Override 
public void equals(Object ob){ 

} 

non riuscirà a compilare

1

Il @Override annotazione non "determina" nulla. È semplicemente una bandiera che indica al compilatore di generare un errore se il metodo annotato non sta sovrascrivendo una superclasse o un metodo di interfaccia. È uno strumento per gli sviluppatori per aiutare a mantenere il loro equilibrio mentale, e nient'altro.

In questo caso specifico, è semplicemente notare che l'attuazione hashCode() in OvTester è prevalente il metodo hashCode() definito Object. Questo non ha nulla a che fare con toString() e chiamare il metodo toString() della superclasse dal tuo metodo hashCode() non è/non è la stessa cosa che sovrascrive lo toString().

è vero? il metodo hashCode() in OvTester deve sovrascrivere lo stesso metodo di nome nella sua super classe?

Questo è vero, nel senso che l'annotazione causerà al compilatore di sollevare un errore se non c'è una hashCode() metodo di override nella superclasse che corrisponde la firma del metodo annotato.

0

Questo codice sostituisce il metodo hashCode() nella classe base Object. Il metodo toString() ha ancora l'implementazione originale.

per ignorare il toString(), effettuare le seguenti operazioni:

@Override 
public String toString() { 
    //Your own toString() implememntation here 
} 

Finché il metodo nella classe bambino ha lo stesso nome e la firma come metodo nella classe padre, E il metodo in la classe genitore è NON privata verrà sovrascritta (a prescindere dalla presenza dell'annotazione @Override)