2010-03-22 15 views
13
public class Animal { 
    public void eat() { System.out.println("I eat like a generic Animal."); } 

} 

public class Wolf extends Animal { 
    @Override 
    public void eat() { System.out.println("I eat like a wolf!"); } 
} 

¿Tiene realmente alguna funcionalidad @Override o simplemente es un comentario?¿Qué es "@Override" allí en java?

+0

Duplicado: http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why –

Respuesta

21

De los tutoriales de Java en annotations:

@Override - la @Override anotación informa al compilador que el elemento está destinado a reemplazar un elemento declarado en una superclase (anulando métodos se discutirá en la lección titulada "Interfaces y Herencia").

// mark method as a superclass method 
    // that has been overridden 
    @Override 
    int overriddenMethod() { } 

Si bien no es necesario para utilizar este anotación al redefinir un método, ayuda a prevenir errores. Si un método marcado con @Override falla al anula correctamente un método en una de sus superclases, el compilador genera un error.

Echemos un vistazo al ejemplo dado en las especificaciones del lenguaje Java, 9.6.1.4 Override. Digamos que desea reemplazar un método, equals en ese caso, pero que escribió:

public boolean equals(Foo that) { ... } 

en lugar de:

public boolean equals(Object that) { ... } 

Aunque este código es legal, la anotación de la declaración equals método con @Override desencadenaría un error de tiempo de compilación porque de hecho no lo está anulando, lo está sobrecargando. Esto puede causar errores desagradables y el tipo de anotación Override ayuda a detectarlos temprano.

+0

Por lo tanto, no afecta el comportamiento de tiempo de ejecución, ¿verdad? – symfony

+0

Correcto. No afectará nada después del tiempo de compilación. –

+0

Sin embargo, evitará las compilaciones que tengan errores. – Thilo

11

Anular anotación es una anotación de tiempo de compilación que hace que el compilador java arroje un error si el método que tiene esta anotación no está anulando un método de clase principal. Puede intentar cambiar la clase Wolf para no extender la clase Animal y si la Anulación Anular está presente le mostrará un error de tiempo de compilación

+0

http://java.sun.com/j2se/1.5.0 /docs/api/java/lang/Override.html – Woot4Moo

+1

@symfony No, no en el código anterior. Pero si ha escrito incorrectamente "come como come" y no tiene el @override, entonces el compilador pensaría que está creando un nuevo método y compilaría bien sin previo aviso. Le permite al compilador encontrar errores. Más comúnmente ayuda al desarrollador a encontrar errores si se usa el tipo incorrecto en un parámetro de método, como hacer 'public boolean equals (MyObject o)' en lugar de 'public boolean equals (Object o)'. –

+0

Por último, ¿distingue entre mayúsculas y minúsculas? Veo que escribe @override en lugar de @Override – symfony

0

Si elimina el método "comer" de la clase principal o lo escribe mal como "come" en la subclase, su código no podrá compilarse. Sin la anotación "@Override", puede hacer cualquiera de los dos y su código aún se compilará, simplemente no hará lo que quiera (es decir, anulará un método).

0

No sirve de nada en tiempo de ejecución, pero le ayuda a detectar errores:

Si usted pensó que le podría reemplazar un método, pero no lo hacen (debido a un problema speling o parámetros tipos), sin la anotación, el código compilaría algo inútil (como en: su método no sería llamado, pero se llama al método de la superclase que accidentalmente no anuló).