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
defaultSchlüsselwörter reichen aus, wie folgt:
public interface A { /** * 默认方法定义 */ default void method() { System.out.println("This is a default method!"); } }Wenn wir eine Standardmethode wie diese definieren, halten alle Unterklassen, die diese Schnittstelle implementieren, indirekt diese Methode. Oder Sie denken vielleicht wie ich, dass sich Schnittstellen und abstrakte Klassen tatsächlich immer ähnlicher werden, es aber immer noch die folgenden Unterschiede zwischen ihnen gibt:
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!Hier Da Schnittstelle B näher an C als A liegt und die Methode von B gemäß Regel 2 eine bestimmte Standardimplementierung ist, wird sie hier tatsächlich als Standardmethode von Schnittstelle B bezeichnet
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 2 fügt eine Klasse D hinzu, die die Schnittstelle A auf der Grundlage der ursprünglichen Schnittstellen A und B implementiert, und dann erbt Klasse C von D und implementiert A und B. Obwohl C näher an D liegt, Da sich die spezifische Implementierung von D in A befindet, ist die Standardmethode in B immer noch die nächstgelegene Standardimplementierung. Gemäß Regel 2 wird hier tatsächlich die Standardmethode von B aufgerufen.
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(); } }In Beispiel 3 erbt Schnittstelle B nicht mehr von Schnittstelle A, daher wird zu diesem Zeitpunkt die Standardmethode in C aufgerufen
method()Der spezifische Implementierungsabstand der Schnittstellen A und B ist derselbe und der Compiler kann ihn nicht bestimmen. Daher wird ein Fehler gemeldet. In diesem Fall muss er explizit angegeben werden:
B.super.method(). Das Obige ist der Inhalt der neuen Funktion von Java8, der Standardschnittstellenmethode. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!