2011-09-06 21 views
61

Possiamo fare un == su una variabile Class anziché equals e aspettarci lo stesso risultato?Java è uguale a una classe. == uguale a .equals

Ad esempio:

Class clazz = xyz; 

Caso A:

if(clazz == Date.class) { 
// do something 
} 

Caso B:

if(Date.class.equals(clazz)) { 
// do something 
} 

sono case A e B Caso funzionalmente stesso?

+2

Possibile -http duplicato: //stackoverflow.com/questions/971954/difference-between-equals-and – mre

+9

@mre, ben la mia domanda riguarda specificamente le istanze di tipo Class. Il programma di caricamento classi è garantito per restituire la stessa istanza di Class per un determinato tipo di dati o meno. – Ramesh

+0

Sulla base di alcuni esperimenti rapidi, sembra sì. Non so se è garantito, però. –

risposta

77

La classe è definitiva, quindi non è possibile sovrascrivere la sua equazione(). Le sue equals() il metodo è ereditato da Object che recita

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

Quindi sì, sono la stessa cosa per una classe, o di qualsiasi tipo che non esclude equals(Object)

Per rispondere alla tua seconda domanda, ogni ClassLoader può caricare una classe solo una volta e ti darà sempre la stessa classe per un nome completo completo.

+4

è possibile che due diversi caricatori di classe abbiano prodotto classi diverse e si siano imbattuti? – voipp

+2

@voipp è possibile che tu possa avere due istanze della "stessa" classe ottenuta da due caricatori di classi diverse, ma tale situazione non si presenterebbe in circostanze normali – kbolino

+1

E anche se quella situazione fosse arrivata, le due classi sarebbero ancora considerato distinto secondo il metodo degli uguali. Dovresti confrontare le classi per nome se volevi sapere se sono "uguali", ma potrebbero comunque essere due versioni diverse della stessa classe o anche una collisione accidentale creata da due diversi sviluppatori. Dal punto di vista della jvm, ovviamente, non sono intercambiabili, anche se sono identici. –

5

Sì.

Date un'occhiata al Class class description e notare che eredita equals da Object, per il quale il metodo legge:

"Il equivale metodo per la classe Object implementa la più esigente relazione di equivalenza possibile su oggetti, cioè, per qualsiasi valore di riferimento non nullo xey, questo metodo restituisce true se e solo se x e y si riferiscono allo stesso oggetto (x == y ha il valore true). "

4

Sì, dal momento che il codice per equals(...) per la classe è la seguente:

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