Zusammenfassung: Ab Java8 ist die Schnittstelle nicht nur ein Ort, an dem Methoden deklariert werden können. Wir können der Methode auch eine Standardimplementierung geben, wenn wir sie als Standardschnittstellenmethode bezeichnen Implementieren Sie die Schnittstelle. Klassen können eine Standardimplementierung dieser Methode enthalten.
Java8 kann als die Version angesehen werden, die sich im iterativen Prozess der Java-Versionsaktualisierung am meisten geändert hat (nur durch Wenn wir mit der Zeit gehen, können wir uns freuen, dass er unsterblich ist), aber nach so vielen Jahren der Entwicklung und Iteration ist der Quellcode von Java zu einem Giganten geworden, und es wird definitiv nicht einfach sein, einen großen Schritt in diese Richtung zu machen ein riesiges Volumen. Als ich also zum ersten Mal die Standardschnittstellenmethoden von Java 8 sah, hatte ich zunächst das Gefühl, dass dies eine Lücke war, die von Java-Designern gegraben wurde, bevor sie sie füllten.
Aus den vorherigen Erklärungen wissen wir, dass Java8 den vorhandenen Schnittstellen viele Methoden hinzugefügt hat, beispielsweise die
sort(Comparator<? super E> c)
-Methode von List. Wenn Sie den Entwurfsideen von Schnittstellen vor Java 8 folgen und einer Schnittstelle eine Methodendeklaration hinzufügen, muss die Klasse, die die Schnittstelle implementiert, eine entsprechende Implementierung für die neu hinzugefügte Methode hinzufügen. Aus Kompatibilitätsgründen ist dies nicht ratsam, daher stellt es eine Falle dar, und neue Funktionen erfordern das Hinzufügen einiger neuer Methoden zur Schnittstelle. Um den Kuchen zu haben und ihn auch zu essen, haben die Designer von Java8 die Standardschnittstellenmethode vorgeschlagen . Konzept.
Auf diese Weise scheint die Standardschnittstellenmethode für API-Designer entwickelt zu sein, die für uns normale Entwickler noch weit entfernt ist. Es ist etwas verwirrend, so zu denken, obwohl wir kein JDK entwerfen müssen Im täglichen Entwicklungsprozess müssen wir weiterhin APIs bereitstellen, die andere Geschäftsparteien aufrufen können. Wenn wir unsere APIs aktualisieren, können wir die Standardmethode verwenden, um erweiterte Funktionen bereitzustellen und gleichzeitig die Kompatibilität aufrechtzuerhalten.
Die Definition der Standardschnittstellenmethode ist sehr einfach, fügen Sie einfach ein
default
public interface A { /** * 默认方法定义 */ default void method() { System.out.println("This is a default method!"); } }
1. Eine Klasse kann nur eine Klasse erben, aber mehrere implementieren Schnittstellen
2. Abstrakte Klassen können Variablen definieren, Schnittstellen jedoch nicht
Zusätzlich zur Lösung der oben genannten Probleme hat die Abstraktion auch die folgenden Vorteile:
1 sind nicht alle Für Methoden, die alle Unterklassen benötigen, geben wir ihr eine Standardimplementierung, um bedeutungslose Implementierungen in Unterklassen zu vermeiden (im Allgemeinen werden wir neue UnsupportedException() auslösen)
2 Die Standardmethode ist Java. Mehrfachvererbung bietet eine neue Weise (obwohl wir nur eine Klasse erben können, können wir mehrere Schnittstellen implementieren, und jetzt können Schnittstellen auch Standardmethoden definieren)
1. Explizit deklarierte Methoden in einer Klasse oder übergeordneten Klasse haben eine höhere Priorität als alle Standardmethoden
2. Wenn Regel 1 fehlschlägt, wählen Sie die Standardmethode mit einer bestimmten Implementierung aus, die der aktuellen Klasse am nächsten kommt
3. Wenn Regel 2 ebenfalls fehlschlägt, müssen Sie die Schnittstelle explizit angeben
Das Folgende wird anhand mehrerer Beispiele erklärt:
Beispiel 1
public interface A { /** * 默认方法定义 */ default void method() { System.out.println("A's default method!"); } } public interface B extends A { /** * 默认方法定义 */ default void method() { System.out.println("B's default method!"); } } public class C implements A, B { public static void main(String[] args) { new C().method(); } } // 输出:B's default method!
Beispiel 2
public class D implements A { } public class C extends D implements A, B { public static void main(String[] args) { new C().method(); } } // 输出:B's default method!
Beispiel 3
// A接口不变 public interface B { /** * 默认方法定义 */ default void method() { System.out.println("B's default method!"); } } public class C implements A, B { @Override public void method() { // 必须显式指定 B.super.method(); } public static void main(String[] args) { new C().method(); } }
method()
B.super.method()