Heim > Java > javaLernprogramm > Hauptteil

Neue Funktionen von Java 8: Standardschnittstellenmethoden

黄舟
Freigeben: 2017-02-23 10:25:28
Original
1485 Leute haben es durchsucht

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.

1. Der Hintergrund der Einführung von Standardschnittstellenmethoden

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)
Nach dem Login kopieren

-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.

2. Definition der Standardschnittstellenmethode

Die Definition der Standardschnittstellenmethode ist sehr einfach, fügen Sie einfach ein

default
Nach dem Login kopieren
<🎜 vor der Methodendefinition hinzu der Schnittstelle >Schlüsselwörter reichen aus, wie folgt:


public interface A {
    /**
     * 默认方法定义
     */
    default void method() {
        System.out.println("This is a default method!");
    }
}
Nach dem Login kopieren
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)

3. Konflikte und ihre Lösungen

Weil eine Klasse das kann Wenn mehrere Schnittstellen implementiert werden, treten Konflikte auf, wenn eine Klasse mehrere Schnittstellen implementiert und in diesen Schnittstellen zwei oder mehr Standardmethoden mit derselben Methodensignatur vorhanden sind. Java8-Definition Die folgenden drei Prinzipien werden zum Lösen von Konflikten verwendet:


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&#39;s default method!");
    }
}
public interface B extends A {
    /**
     * 默认方法定义
     */
    default void method() {
        System.out.println("B&#39;s default method!");
    }
}
public class C implements A, B {
    public static void main(String[] args) {
        new C().method();
    }
}
// 输出:B&#39;s default method!
Nach dem Login kopieren
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&#39;s default method!
Nach dem Login kopieren
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&#39;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();
    }
}
Nach dem Login kopieren
In Beispiel 3 erbt Schnittstelle B nicht mehr von Schnittstelle A, daher wird zu diesem Zeitpunkt die Standardmethode in C aufgerufen


method()
Nach dem Login kopieren
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()
Nach dem Login kopieren
.

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)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage