Java Überschreiben und Überladen
Überschreiben
Überschreiben bedeutet, dass eine Unterklasse eine Methode mit demselben Namen, derselben Parameterliste und demselben Rückgabetyp wie eine Methode in ihrer Oberklasse definiert und die Implementierung der Unterklassenmethode die Implementierung der Oberklassenmethode überschreibt.Das heißt, die Hülle bleibt unverändert, aber der Kern wird neu geschrieben!
Der Vorteil des Überschreibens besteht darin, dass eine Unterklasse bei Bedarf ein für sie spezifisches Verhalten definieren kann. Das heißt, die Unterklasse kann die Methode der Elternklasse nach Bedarf implementieren. Auf diese Weise wird, wenn ein Objekt der Unterklasse verwendet wird, um die Methode aufzurufen, die Methode in der Unterklasse ausgeführt und nicht die Methode in der Elternklasse.
Eine überschreibende Methode kann keine neuen geprüften Ausnahmen oder Ausnahmen auslösen, die weiter gefasst sind als die von der überschriebenen Methode deklarierten. Zum Beispiel: Eine Methode in der Elternklasse deklariert eine geprüfte Ausnahme IOException, aber beim Überschreiben dieser Methode können Sie keine Exception auslösen, weil Exception die Elternklasse von IOException ist. Sie können IOException oder eine Unterklasse von IOException auslösen.
In objektorientierten Prinzipien bedeutet Überschreiben, dass jede vorhandene Methode überschrieben werden kann. Hier ist ein Beispiel:
Code der Datei TestDog.java:
Das Kompilierungs- und Ausführungsergebnis des obigen Beispiels lautet wie folgt:
Animals can move Dogs can run and walk
Im obigen Beispiel ist zu sehen, dass b zwar vom Typ Animal ist, aber die move-Methode der Klasse Dog ausführt.
Dies liegt daran, dass während der Kompilierungsphase nur der Referenztyp des Parameters geprüft wird.
Zur Laufzeit bestimmt jedoch die Java Virtual Machine (JVM) den Typ des Objekts und führt die Methode des Objekts aus.
Daher ist im obigen Beispiel die Kompilierung erfolgreich, weil die Klasse Animal die Methode move besitzt; zur Laufzeit wird jedoch die Methode des konkreten Objekts ausgeführt.
Betrachten Sie das folgende Beispiel:
Code der Datei TestDog.java:
Das Kompilierungs- und Ausführungsergebnis des obigen Beispiels lautet wie folgt:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
b.bark();
^
Das Programm wird einen Kompilierungsfehler auslösen, weil der Referenztyp von b, Animal, keine Methode bark besitzt.
Regeln zum Überschreiben von Methoden
Die Parameterliste muss exakt mit der Parameterliste der überschriebenen Methode übereinstimmen.
Der Rückgabetyp kann sich vom Rückgabetyp der überschriebenen Methode unterscheiden, muss aber eine abgeleitete Klasse des Rückgabewerts der Elternklasse sein (in Java 5 und früheren Versionen muss der Rückgabetyp derselbe sein, in Java 7 und späteren Versionen kann er unterschiedlich sein).
Die Zugriffsebene darf nicht niedriger sein als die Zugriffsebene der überschriebenen Methode in der Elternklasse. Zum Beispiel: Wenn eine Methode in der Elternklasse als public deklariert ist, dann kann sie beim Überschreiben in der Unterklasse nicht als protected deklariert werden.
Membermethoden einer Elternklasse können nur von ihren Unterklassen überschrieben werden.
Als final deklarierte Methoden können nicht überschrieben werden.
Als static deklarierte Methoden können nicht überschrieben werden, aber sie können neu deklariert werden.
Wenn die Unterklasse und die Elternklasse im selben Paket sind, kann die Unterklasse alle Methoden der Elternklasse überschreiben, außer als private und final deklarierte Methoden.
Wenn die Unterklasse und die Elternklasse nicht im selben Paket sind, kann die Unterklasse nur die nicht-finalen Methoden der Elternklasse überschreiben, die als public und protected deklariert sind.
Eine überschreibende Methode kann jede unchecked Exception auslösen, unabhängig davon, ob die überschriebene Methode eine Exception auslöst. Allerdings darf eine überschreibende Methode keine neuen checked Exceptions oder breitere checked Exceptions als die von der überschriebenen Methode deklarierten auslösen, während das Gegenteil erlaubt ist.
Konstruktoren können nicht überschrieben werden.
Wenn eine Klasse nicht vererbt werden kann, können ihre Methoden nicht überschrieben werden.
Verwendung des super-Schlüsselworts
Wenn Sie die überschriebene Methode der Elternklasse in einer Unterklasse aufrufen müssen, müssen Sie das super-Schlüsselwort verwenden.
Code der Datei TestDog.java:
Das Kompilierungs- und Ausführungsergebnis des obigen Beispiels lautet wie folgt:
Animals can move Dogs can run and walk
Überladen
Überladen bedeutet, dass innerhalb einer Klasse Methoden denselben Namen, aber unterschiedliche Parameter haben. Der Rückgabetyp kann gleich oder unterschiedlich sein.
Jede überladene Methode (oder jeder Konstruktor) muss eine eindeutige Parameter-Typ-Liste haben.
Der häufigste Anwendungsfall ist das Überladen von Konstruktoren.
Überladungsregeln:
- Überladene Methoden müssen die Parameterliste ändern (die Anzahl oder die Typen der Parameter müssen unterschiedlich sein);
- Überladene Methoden können den Rückgabetyp ändern;
- Überladene Methoden können den Zugriffsmodifizierer ändern;
- Überladene Methoden können neue oder breitere geprüfte Ausnahmen deklarieren;
- Methoden können in derselben Klasse oder in einer Unterklasse überladen werden.
- Der Rückgabetyp kann nicht als Kriterium zur Unterscheidung überladener Funktionen verwendet werden.
Beispiel
Code der Datei Overloading.java:
重写与重载的区别
| Unterschiedspunkt | Überladene Methode | Überschriebene Methode |
|---|---|---|
| Parameterliste | Muss geändert werden | Darf nicht geändert werden |
| Rückgabetyp | Kann geändert werden | Darf nicht geändert werden |
| Ausnahme | Kann geändert werden | Kann reduzieren oder löschen, darf keine neuen oder breiteren Ausnahmen werfen |
| Access | Kann geändert werden | Darf keine strengeren Einschränkungen auferlegen (kann Einschränkungen lockern) |
Zusammenfassung
Methodenüberschreiben und -überladen sind unterschiedliche Erscheinungsformen des Java-Polymorphismus. Überschreiben ist eine Erscheinungsform des Polymorphismus zwischen der Elternklasse und der Unterklasse, und Überladen kann als eine spezielle Form des Polymorphismus verstanden werden.
- (1) Methodenüberladung liegt vor, wenn eine Klasse mehrere Methoden mit demselben Namen definiert, deren Parameter sich jedoch in der Anzahl unterscheiden oder dieselbe Anzahl, aber unterschiedliche Typen und Reihenfolge aufweisen; dies wird als Methodenüberladung bezeichnet.
- (2) Methodenüberschreiben liegt vor, wenn in einer Unterklasse eine Methode mit demselben Namen wie eine Methode in der Elternklasse existiert und die Anzahl und Typen der Parameter gleich und auch der Rückgabewert gleich sind; dies wird als Überschreiben bezeichnet.
- (3) Die Methodenüberladung ist eine Ausprägung von Polymorphie innerhalb einer Klasse, während die Methodenüberschreibung eine Ausprägung von Polymorphie zwischen der Unterklasse und der Elternklasse ist.