Java - Überschreiben
Im vorigen Kapitel haben wir über Oberklassen und Unterklassen gesprochen. Wenn eine Klasse eine Methode von ihrer Oberklasse erbt, besteht die Möglichkeit, die Methode zu überschreiben, sofern sie nicht als final markiert ist.
Der Vorteil des Überschreibens ist:Möglichkeit, ein Verhalten zu definieren, das für den Unterklassentyp spezifisch ist, was bedeutet, dass eine Unterklasse eine Methode der übergeordneten Klasse basierend auf ihren Anforderungen implementieren kann.
Objektorientiert bedeutet Überschreiben, die Funktionalität einer bestehenden Methode zu überschreiben.
Beispiel
Sehen wir uns ein Beispiel an.
Live-Democlass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class } }
Dies wird das folgende Ergebnis erzeugen −
Ausgabe
Animals can move Dogs can walk and run
Im obigen Beispiel sieht man das, obwohl b ist ein Tiertyp, der die Move-Methode in der Dog-Klasse ausführt. Der Grund dafür ist:Zur Kompilierzeit wird auf den Referenztyp geprüft. Zur Laufzeit findet JVM jedoch den Objekttyp heraus und führt die Methode aus, die zu diesem bestimmten Objekt gehört.
Daher wird das Programm im obigen Beispiel ordnungsgemäß kompiliert, da die Klasse Animal die Methode move hat. Dann führt es zur Laufzeit die für dieses Objekt spezifische Methode aus.
Betrachten Sie das folgende Beispiel −
Beispiel
Live-Democlass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } public void bark() { System.out.println("Dogs can bark"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class b.bark(); } }
Dies wird das folgende Ergebnis erzeugen −
Ausgabe
TestDog.java:26: error: cannot find symbol b.bark(); ^ symbol: method bark() location: variable b of type Animal 1 error
Dieses Programm wird einen Kompilierungsfehler ausgeben, da der Referenztyp Animal von b keine Methode namens bark hat.
Regeln für das Überschreiben von Methoden
-
Die Argumentliste sollte genau dieselbe sein wie die der überschriebenen Methode.
-
Der Rückgabetyp sollte derselbe oder ein Untertyp des Rückgabetyps sein, der in der ursprünglichen überschriebenen Methode in der Oberklasse deklariert wurde.
-
Die Zugriffsebene darf nicht restriktiver sein als die Zugriffsebene der überschriebenen Methode. Beispiel:Wenn die Methode der Oberklasse als öffentlich deklariert wird, kann die überschreibende Methode in der Unterklasse weder privat noch geschützt sein.
-
Instanzmethoden können nur überschrieben werden, wenn sie von der Unterklasse geerbt werden.
-
Eine als final deklarierte Methode kann nicht überschrieben werden.
-
Eine als statisch deklarierte Methode kann nicht überschrieben, aber erneut deklariert werden.
-
Wenn eine Methode nicht vererbt werden kann, kann sie nicht überschrieben werden.
-
Eine Unterklasse innerhalb desselben Pakets wie die Oberklasse der Instanz kann jede Methode der Oberklasse überschreiben, die nicht als privat oder final deklariert ist.
-
Eine Unterklasse in einem anderen Paket kann nur die als öffentlich oder geschützt deklarierten nicht-finalen Methoden überschreiben.
-
Eine überschreibende Methode kann alle Uncheck-Ausnahmen auslösen, unabhängig davon, ob die überschriebene Methode Ausnahmen auslöst oder nicht. Die überschreibende Methode sollte jedoch keine geprüften Ausnahmen auslösen, die neu oder umfassender sind als die von der überschriebenen Methode deklarierten. Die überschreibende Methode kann engere oder weniger Ausnahmen werfen als die überschriebene Methode.
-
Konstruktoren können nicht überschrieben werden.
Mit dem Super-Keyword
Beim Aufrufen einer Superklassenversion einer überschriebenen Methode wird die super Schlüsselwort wird verwendet.
Beispiel
Live-Democlass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { super.move(); // invokes the super class method System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal b = new Dog(); // Animal reference but Dog object b.move(); // runs the method in Dog class } }
Dies wird das folgende Ergebnis erzeugen −
Ausgabe
Animals can move Dogs can walk and run
Java
- Java-Operatoren
- Java-Schnittstelle
- String Length() Methode in Java:So finden Sie mit Beispiel
- Java String indexOf() Methode mit Substring &Beispielen
- Java String charAt() Methode mit Beispiel
- Java-String-compareTo()-Methode:Verwendung mit Beispielen
- Java-String enthält()-Methode | Überprüfen Sie die Teilzeichenfolge mit Beispiel
- Java-String-EndsWith()-Methode mit Beispiel
- Java String replace(), replaceAll() und replaceFirst() Methode
- Statische Variable in Java:Was ist statischer Block &Methode [Beispiel]