1. Was ist die Standardmethode und warum sollte es eine Standardmethode geben?
Vereinfacht ausgedrückt kann eine Schnittstelle Implementierungsmethoden haben und es ist keine Implementierungsklasse erforderlich, um ihre Methoden zu implementieren. Fügen Sie einfach das Standardschlüsselwort vor dem Methodennamen hinzu.
Warum brauchen wir diese Funktion? Erstens ist die bisherige Schnittstelle ein zweischneidiges Schwert. Der Vorteil besteht darin, dass sie eher auf Abstraktion als auf spezifische Programmierung ausgerichtet ist. Der Nachteil besteht darin, dass alle Klassen, die die Schnittstelle implementieren, geändert werden müssen Das aktuelle Sammlungsframework vor Java 8 verfügt nicht über eine foreach-Methode. Die normalerweise denkbare Lösung besteht darin, neue Methoden und Implementierungen zu den relevanten Schnittstellen im JDK hinzuzufügen. Allerdings gibt es in der veröffentlichten Version keine Möglichkeit, der Schnittstelle neue Methoden hinzuzufügen, ohne die bestehende Implementierung zu beeinträchtigen. Daher wird die Standardmethode eingeführt. Ihr Zweck besteht darin, das Problem der Inkompatibilität zwischen Schnittstellenänderungen und bestehenden Implementierungen zu lösen.
Einfaches Beispiel: eine Schnittstelle A, die Clazz-Klasse implementiert Schnittstelle A.
Kopieren Sie den Codecode wie folgt:
öffentliche Schnittstelle A {
Standard void foo(){
System.out.println("Calling A.foo()");
}
}
Die öffentliche Klasse Clazz implementiert A {
public static void main(String[] args){
Clazz clazz = new Clazz();
clazz.foo();//Call A.foo()
}
}
Der Code wird kompiliert, obwohl die Clazz-Klasse die foo()-Methode nicht implementiert. Die Standardimplementierung der foo()-Methode wird in Schnittstelle A bereitgestellt.
2. Vergleich zwischen abstrakten Klassen und Schnittstellen in Java 8
Nachdem diese Funktionsfunktion herauskam, reagierten viele Studenten. Was ist der Unterschied zwischen Java 8-Schnittstellen und abstrakten Klassen? Tatsächlich gibt es noch einige, zum Vergleich sehen Sie sich bitte die Tabelle unten an. .
| Ähnlichkeiten | Unterschiede |
1. Sie sind alle abstrakte Typen; 2. Alle können Implementierungsmethoden haben (Schnittstellen funktionierten vorher nicht); 3. Sie können alle Methoden implementieren, ohne Klassen oder Erben zu implementieren (dies war vorher nicht möglich, jetzt müssen die Standardmethoden in der Schnittstelle nicht vom Implementierer implementiert werden). | 1. Abstrakte Klassen können keine Mehrfachvererbung haben, Schnittstellen jedoch (unabhängig davon, ob es sich um Mehrfachtypvererbung oder Mehrfachverhaltensvererbung handelt); 2. Abstrakte Klassen und Schnittstellen spiegeln unterschiedliche Designkonzepte wider. Tatsächlich repräsentieren abstrakte Klassen die „Ist-ein“-Beziehung und Schnittstellen repräsentieren die „Wie-ein“-Beziehung; 3. Die in der Schnittstelle definierten Variablen haben standardmäßig den öffentlichen statischen Endtyp und ihr Anfangswert muss angegeben werden, sodass sie in der Implementierungsklasse nicht neu definiert werden können und ihre Werte auch nicht in den Standardwerten der abstrakten Klasse geändert werden können zum benutzerfreundlichen Typ, und ihre Werte können in der Unterklasse angegeben oder neu zugewiesen werden. |
3. Konfliktbeschreibung der Mehrfachvererbung
Da dieselbe Methode über verschiedene Schnittstellen eingeführt werden kann, treten natürlich Konflikte auf. Die Regeln zur Bestimmung von Konflikten durch Standardmethoden lauten wie folgt:
1. Eine in einer Klasse deklarierte Methode hat Vorrang vor jeder Standardmethode (Klassen gewinnen immer)
2. Andernfalls wird zuerst die spezifischste Implementierung ausgewählt. Im folgenden Beispiel schreibt B beispielsweise die Hello-Methode von A neu.
Die Ausgabe ist: Hello World von B
Wenn Sie die Standardfunktion von A aufrufen möchten, verwenden Sie die neue Syntax X.super.m(...). Ändern Sie als Nächstes die Klasse C, implementieren Sie die A-Schnittstelle und schreiben Sie eine Hallo-Methode neu, wie unten gezeigt:
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse C implementiert A{
@Override
public void hallo(){
A.super.hello();
}
public static void main(String[] args){
neues C().hello();
}
}
Die Ausgabe ist: Hello World von A
4. Zusammenfassung
Die Standardmethode bietet uns die Möglichkeit, die Schnittstelle zu ändern, ohne die Struktur der ursprünglichen Implementierungsklasse zu zerstören. Derzeit hat das Sammlungsframework von Java 8 umfassend Standardmethoden verwendet, um es zu verbessern Von Java 8 ist es für einen reibungslosen Übergang vorgesehen. Vielleicht werden wir in Zukunft mehr Anwendungen von Standardmethoden im API-Design sehen.