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:

class Animal{ public void move(){ System.out.println("Tiere können sich bewegen"); } } class Dog extends Animal{ public void move(){ System.out.println("Hunde können rennen und laufen"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); //Animal-Objekt Animal b = new Dog(); //Dog-Objekt a.move();//Führen Sie die Methode der Klasse Animal aus b.move();//Führen Sie die Methode der Klasse Dog aus } }

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:

class Animal{ public void move(){ System.out.println("Tiere können sich bewegen"); } } class Dog extends Animal{ public void move(){ System.out.println("Hunde können rennen und laufen"); } public void bark(){ System.out.println("Hunde können bellen"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); //Animal-Objekt Animal b = new Dog(); //Dog-Objekt a.move();//Führen Sie die Methode der Klasse Animal aus b.move();//Führen Sie die Methode der Klasse Dog aus b.bark(); } }

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:

class Animal{ public void move(){ System.out.println("Tiere können sich bewegen"); } } class Dog extends Animal{ public void move(){ super.move(); //Aufruf der Methode der Elternklasse mit super System.out.println("Hunde können rennen und laufen"); } } public class TestDog{ public static void main(String args[]){ Animal b = new Dog(); //Dog-Objekt b.move(); //Methode der Klasse Dog ausführen } }

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:

public class Overloading { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2"); } //Die folgenden beiden haben eine unterschiedliche Reihenfolge der Parametertypen public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading o = new Overloading(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"test3")); System.out.println(o.test("test4",1)); } }

重写与重载的区别

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.

Andere Erweiterungen