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!"); } 
} 

Hat @Override tatsächlich einige Funktionalität oder es ist nur ein Kommentar?Was ist "@Override" dort für in Java?

+0

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

Antwort

21

aus den Java-Tutorials auf annotations:

@Override - die @Override Anmerkung die Compiler darüber informiert, dass das Element gemeint ist, in einer Oberklasse (zwingende Methoden ein Element erklärte außer Kraft zu setzen diskutiert in der Lektion mit dem Titel "Schnittstellen und Vererbung").

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

Während es nicht ist erforderlich, um diese Anmerkung zu verwenden, wenn eine Methode überschrieben, es hilft, Fehler zu vermeiden. Wenn eine -Methode, die mit @Override nicht markiert ist, eine Methode in einer der Klassen korrekt außer Kraft setzt, generiert der Compiler einen Fehler.

Werfen wir einen Blick auf das Beispiel, das in den Java-Sprachspezifikationen 9.6.1.4 Override angegeben ist. Angenommen, Sie haben eine Methode außer Kraft setzen möchten, equals in diesem Fall, aber Sie schrieb:

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

statt:

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

Während dieser Code legal ist, mit @Override die equals Methodendeklaration mit Anmerkungen versehen auslösen würde ein Fehler bei der Kompilierung, weil Sie ihn nicht überschreiben, sondern überladen. Dies kann unangenehme Fehler verursachen und der Annotationstyp Override hilft bei der frühzeitigen Erkennung.

+0

Also hat es keinen Einfluss auf das Laufzeitverhalten, oder? – symfony

+0

Korrigieren. Es wird nichts nach der Build-Zeit beeinflussen. –

+0

Es verhindert jedoch Builds, die fehlerhaft sind. – Thilo

11

Override-Annotation ist eine Kompilierungszeit-Annotation, die den Java-Compiler dazu veranlasst, einen Fehler auszulösen, wenn die Methode mit dieser Annotation tatsächlich eine Elternklassenmethode nicht überschreibt. Sie können versuchen, die Wolf-Klasse zu ändern, um die Animal-Klasse nicht zu erweitern, und wenn Override-Annotation vorhanden ist, zeigt es Ihnen einen Kompilierzeitfehler

+0

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

+1

@symfony Nein, nicht im obigen Code. Aber wenn Sie essen, wie isst, fehlten und das @override nicht hatten, dann würde der Compiler denken, dass Sie eine neue Methode erstellen und ohne Warnung kompilieren würden. Es ermöglicht dem Compiler, Fehler zu finden. Häufiger hilft es dem Entwickler, Fehler zu finden, wenn der falsche Typ in einem Methodenparameter verwendet wurde, z. B. wenn 'public boolean equals (MyObject o) 'anstelle von' public boolean equals (Object o) 'ausgeführt wird. –

+0

Last, ist es Groß-und Kleinschreibung? Ich sehe Sie schreiben @override anstelle von @Override – symfony

0

Es funktioniert als ein Kommentar, sondern auch als eine Behauptung, dass Sie eigentlich etwas übersteuern. Wenn Sie @Override verwenden, aber nichts überschreibt, generiert der Compiler einen Fehler. See the documentation page for more details.

0

Wenn Sie die Methode "essen" aus der übergeordneten Klasse entfernen oder sie in der Unterklasse als "isst" falsch schreiben, wird der Code nicht mehr kompiliert. Ohne die Annotation "@Override" können Sie beides tun und Ihr Code wird immer noch kompilieren, er wird einfach nicht das tun, was Sie wollen (nämlich eine Methode überschreiben).

0

Es tut nichts zur Laufzeit, aber es hilft Ihnen, Fehler zu fangen:

Wenn Sie dachten, Sie eine Methode außer Kraft setzen würde, aber nicht (wegen ein speling Problem oder Parametertypen), ohne Bei der Annotation würde der Code zu etwas nutzlos kompilieren (wie in: Ihre Methode würde nicht aufgerufen werden, aber die Superklassenmethode, die Sie versehentlich nicht überschrieben haben, wird aufgerufen).