In diesem Artikel werden Beispiele verwendet, um den Unterschied zwischen Überladung und Umschreiben in Java im Detail zu analysieren.
1. Überladung:
(1) Methodenüberladung ist ein Mittel für eine Klasse, um verschiedene Datentypen auf einheitliche Weise zu verarbeiten. Es existieren gleichzeitig mehrere Funktionen mit demselben Namen und unterschiedlicher Anzahl/Art von Parametern.
Überladung ist eine Manifestation von Polymorphismus in einer Klasse.
(2) Java-Methodenüberladung bedeutet, dass Sie mehrere Methoden in einer Klasse erstellen können. Sie haben den gleichen Namen, aber unterschiedliche Parameter und unterschiedliche Definitionen.
Beim Aufrufen von Methoden entscheiden Sie anhand der Anzahl und Art der an sie übergebenen Parameter, welche Methode verwendet werden soll.
(3) Beim Überladen sollten die Methodennamen gleich sein, aber die Parametertypen und -nummern sind unterschiedlich und die Rückgabewerttypen können gleich oder unterschiedlich sein. Der Rückgabetyp kann nicht als Kriterium zur Unterscheidung überladener Funktionen verwendet werden.
Das Folgende ist ein Beispiel für Überladung:
package c04.answer;//这是包名 //这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog类的构造方法中利用this关键字调用不同的bark方法。 不同的重载方法bark是根据其参数类型的不同而区分的。 //注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。 package c04.answer; public class Dog { Dog() { this.bark(); } void bark()//bark()方法是重载方法 { System.out.println(\"no barking!\"); this.bark(\"female\", 3.4); } void bark(String m,double l)//注意:重载的方法的返回值都是一样的, { System.out.println(\"a barking dog!\"); this.bark(5, \"China\"); } void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分 { System.out.println(\"a howling dog\"); } public static void main(String[] args) { Dog dog = new Dog(); //dog.bark(); [Page] //dog.bark(\"male\", \"yellow\"); //dog.bark(5, \"China\");
2. Überschreiben (Überschreiben)
(1) Polymorphismus zwischen Elternklasse und Unterklasse, Definieren Sie die Funktionen neu Elternklasse. Wenn eine in einer Unterklasse definierte Methode denselben Namen und dieselben Parameter wie ihre übergeordnete Klasse hat, spricht man von einer überschreibenden Methode. In können Unterklassen Methoden von der übergeordneten Klasse erben, ohne dieselben Methoden neu schreiben zu müssen.
Aber manchmal möchte die Unterklasse die Methoden der übergeordneten Klasse nicht unverändert erben, sondern bestimmte Änderungen vornehmen, was ein Umschreiben der Methoden erfordert.
Das Überschreiben von Methoden wird auch als Methodenüberschreiben bezeichnet.
(2) Wenn eine Methode in der Unterklasse denselben Methodennamen, denselben Rückgabetyp und dieselbe Parameterliste wie eine Methode in der übergeordneten Klasse hat, überschreibt die neue Methode die ursprüngliche Methode.
Wenn Sie die ursprüngliche Methode in der übergeordneten Klasse benötigen, können Sie das Schlüsselwort super verwenden, das auf die übergeordnete Klasse der aktuellen Klasse verweist.
(3) Die Zugriffsänderungsrechte von Unterklassenfunktionen dürfen nicht geringer sein als die der übergeordneten Klasse
Das Folgende ist ein Beispiel für das Umschreiben:
Konzept: der Mechanismus zum Aufrufen von Objektmethoden.
Die Insider-Geschichte der dynamischen Bindung:
1 Der Compiler überprüft den Typ und Methodennamen der Objektdeklaration, um alle Kandidatenmethoden zu erhalten. Versuchen Sie, den Test der Basisklasse im obigen Beispiel auszukommentieren. Andernfalls wird die Kompilierung nicht bestanden.
2. Überlastungsentscheidung: Der Compiler prüft den Parametertyp des Methodenaufrufs und wählt die einzige der oben genannten Kandidatenmethoden aus (während dieses Prozesses findet eine implizite Typkonvertierung statt).
Wenn der Compiler mehr als eine oder keine findet, meldet der Compiler einen Fehler. Versuchen Sie, den Test (Byte b) der Basisklasse im obigen Beispiel auszukommentieren, und das laufende Ergebnis ist 1 1.
3. Wenn der Methodentyp „Private Static Final“ ist und Java die statische Kompilierung verwendet, weiß der Compiler genau, welche Methode er aufrufen muss.
4. Wenn das Programm ausgeführt wird und eine dynamische Bindung zum Aufrufen einer Methode verwendet, muss die virtuelle Maschine die Methodenversion aufrufen, die dem tatsächlichen Typ des Objekts entspricht.
Im Beispiel ist der tatsächliche Typ, auf den b zeigt, TestOverriding, daher ruft b.test(0) den Test der Unterklasse auf.
Die Unterklasse überschreibt jedoch nicht test(byte b), daher ruft b.test((byte)0) den test(byte b) der übergeordneten Klasse auf.
Wenn das (Byte b) der übergeordneten Klasse auskommentiert ist, wird der implizite Typ im zweiten Schritt in int konvertiert und schließlich wird der Test (int i) der Unterklasse aufgerufen.
Einfach ausgedrückt kann dieselbe Methode die Eingabedaten ändern Führen Sie je nach Eingabedaten eine unterschiedliche Verarbeitung durch, d Dasselbe, aber wenn Sie eine Antwort erzeugen, die sich von der der übergeordneten Klasse unterscheidet, müssen Sie die Methode der übergeordneten Klasse überschreiben,
das heißt, die Methode in der Unterklasse neu schreiben – dieselben Parameter, unterschiedliche Implementierungen (dynamischer Polymorphismus)
OOP Drei Hauptmerkmale: Vererbung, Polymorphismus und Kapselung.
Das Ausgabeergebnis zu diesem Zeitpunkt ist 1 0, was das Ergebnis der dynamischen Bindung zur Laufzeit ist.
public class Base { void test(int i) { System.out.print(i); } void test(byte b) { System.out.print(b); } } public class TestOverriding extends Base { void test(int i) { i++; System.out.println(i); } public static void main(String[]agrs) { Base b=new TestOverriding(); b.test(0) b.test((byte)0) } }
Dies wird auch als Polymorphismus bezeichnet. Methoden können nur in Vererbungsbeziehungen existieren Überschreiben Sie nur nicht private Methoden der übergeordneten Klasse.
Wenn die speak()-Methode der Vaterklasse im obigen Beispiel privat ist, kann die Son-Klasse die speak()-Methode der Vaterklasse nicht überschreiben. Zu diesem Zeitpunkt entspricht die speak()-Methode der Son-Klasse einer definierten speak() in der Son-Klasse-Methode.publicclassFather{ publicvoidspeak(){ System.out.println(Father); } } publicclassSonextendsFather{ publicvoidspeak(){ System.out.println("son"); } }
Beim Versuch, sie zu kompilieren Code kompilieren Der Server meldet einen Fehler. Beispiel:
Wenn die speak()-Methode der Vaterklasse standardmäßig geändert wird, kann sie nur von ihren Unterklassen im selben Paket überschrieben werden. Wenn sie sich nicht im selben Paket befindet, kann sie nicht überschrieben werden .
publicclassFather{ finalpublicvoidspeak(){ System.out.println("Father"); } } publicclassSonextendsFather{ publicvoidspeak(){ System.out.println("son"); } }//编译器会报错;
Regeln zum Überschreiben von Methoden:
1. Die Parameterliste muss vollständig mit der überschriebenen Methode übereinstimmen, sonst kann es nicht als Umschreiben, sondern als Überladen bezeichnet werden.
2. Der Rückgabetyp muss immer mit dem Rückgabetyp der überschriebenen Methode identisch sein, sonst kann es nicht als Überschreiben, sondern als Überladen bezeichnet werden.
3. Der Zugriffsmodifikator-Grenzwert muss größer sein als der Zugriffsmodifikator der überschriebenen Methode (public>protected>default>private)
4. Die überschriebene Methode darf keine neue Prüfausnahme auslösen oder schwerer sein als der Zugriff Modifikator der überschriebenen Methode. Schreiben Sie Methodendeklarationen, die allgemeinere geprüfte Ausnahmen sind. Beispiel:
Eine Methode der übergeordneten Klasse deklariert eine geprüfte Ausnahme IOException. Beim Überschreiben dieser Methode können Sie keine Ausnahmen auslösen. Sie können nur Ausnahmen von Unterklassen von IOException auslösen.
Die Regeln für die Überladung:
1. Es müssen unterschiedliche Parameterlisten vorhanden sein.
2. Sie können nicht beschuldigende Rückgabetypen haben >3. Kann unterschiedliche Zugriffsmodifikatoren haben;
Der Unterschied zwischen Umschreiben und Überladen ist:
Das Aufrufen überladener Methoden kann dies erheblich reduzieren Menge an Codeeingaben. Der gleiche Methodenname kann unterschiedliche Funktionen oder Rückgabewerte haben, solange ihm unterschiedliche Parameter übergeben werden.
Durch die gute Verwendung von Umschreiben und Überladen kann eine Klasse mit einer klaren und prägnanten Struktur entworfen werden. Man kann sagen, dass Umschreiben und Überladen eine außergewöhnliche Rolle beim Schreiben von Code spielen.
Weitere Beispiele in Java Artikel zum Unterschied zwischen Überladen und Umschreiben finden Sie auf der chinesischen PHP-Website!