2011-08-23 22 views
9

Puede alguien decirme si este código:anotación @ Override

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

determina que el método toString en la clase OvTester reemplaza el método toString en su superclase.

Me gustaría saber si esto es cierto, y si es así, ¿cómo funciona?

Si no es verdad, pues, es lo cierto:

"el método hashCode() en OvTester tendrá prioridad sobre el mismo método en nombre de su superclase"

?

Si eso no es correcto, entonces, ¿qué es correcto?

+1

Su clase no parece tener una superclase, por lo que esto fallaría. – Sirs

+9

por supuesto tiene una superclase - 'java.lang.Object' – Bozho

Respuesta

13

el reemplazo de métodos que sucede cuando se vuelve a definir un método con la misma firma en un sublcass.

Así que aquí está sustituyendo hashCode(), no toString()

La anotación @Override es opcional (pero muy bueno) e indica que se espera que ser de primer orden. Si escribe mal algo o tiene un parámetro mal escrito, el compilador lo advertirá.

Así que sí, la segunda afirmación es cierta (y la superclase en este caso es java.lang.Object)

2

Me gustaría saber si esto es cierto, y si es así ¿Cómo funciona?

No, no es exactamente cierto.

El @Overrides anotación dice que "este método, se sustituye el método con el mismo nombre en la superclase".

En este caso, el hashCode de OvTester anula el hashCode en Object.

si no es cierto, entonces ¿es cierto: el método hashCode() en OvTester tendrá prioridad sobre el mismo método en nombre de su superclase?

Sí. Así es exactamente como funciona.


Cuando un método no hace nada más que para llamar a otro método (casi lo que tienes en tu ejemplo) que generalmente se conoce como un delegate method. Quizás es con lo que estás confundiendo esto.

0

No, solo significará que se está anulando el método hashCode(). El compilador comprobará en tiempo de compilación que hashCode() realmente es un método (con esa firma) que está siendo anulado.

0

@Override es solo tiempo de compilación comprobar si el implementador realmente anula el método.

si se intenta anular

@Override 
public void equals(Object ob){ 

} 

no será capaz de compilar

1

La anotación @Override no "determinar" nada. Es simplemente un indicador que le dice al compilador que genere un error si el método anotado no anula una superclase o método de interfaz. Es una herramienta para que los desarrolladores ayuden a mantener su cordura, y nada más.

En este caso concreto, se trata simplemente de señalar que la aplicación hashCode() en OvTester es reemplazar el método definido en hashCode()Object. Esto no tiene nada que ver con toString(), y llamar al método toString() de la superclase desde su método hashCode() no será/no es lo mismo que anular toString().

¿Es esto verdad? el método hashCode() en OvTester debe anular el mismo método de nombre en su superclase?

Eso es cierto, en el sentido de que la anotación hará que el compilador para elevar un error si no hay un método hashCode() reemplazable en la superclase que coincide con la firma del método anotada.

0

Ese código anula el método hashCode() de la clase base Object. El método toString() todavía tiene la implementación original.

para anular el toString(), de hacer lo siguiente:

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

Mientras que el método en la clase hija tiene el mismo nombre y la firma como el método de la clase padre, Y el método de la clase principal es NOT privada se omitirá (independientemente de la presencia de la anotación @Override)