Eine Schnittstelle in Java ähnelt einer Klasse, der Hauptteil einer Schnittstelle kann jedoch nur abstrakte Methoden und
final
Felder (Konstanten) enthalten.
Kürzlich habe ich eine Frage gesehen, die so aussieht
interface AnInterface {
public default void myMethod() {
System.out.println("D");
}
}
Gemäß der Schnittstellendefinition sind nur abstrakte Methoden zulässig. Warum kann ich den obigen Code kompilieren? Was ist das default
Schlüsselwort?
Auf der anderen Seite, wenn ich versucht habe, unten Code zu schreiben, dann heißt es modifier default not allowed here
default class MyClass{
}
anstatt
class MyClass {
}
Kann mir jemand den Zweck des default
Schlüsselworts sagen ? Ist es nur innerhalb einer Schnittstelle erlaubt? Wie unterscheidet es sich von default
(kein Zugriffsmodifikator)?
Antworten:
Es ist eine neue Funktion in Java 8
interface
, mit der eine Implementierung bereitgestellt werden kann. Beschrieben in Java 8 JLS-13.5.6. Schnittstellenmethodendeklarationen, die (teilweise) lautenWas ist neu in JDK 8 sagt (teilweise)
quelle
private
Methoden haben.private
Methoden sind nicht wirklich Teil der Schnittstelle, können aber als Hilfsmethoden für diedefault
Implementierungen oder innerhalb konstanter Initialisierer dienen. Beachten Sie, dass sie bereits in Java 8 vorhanden sind, da bei Verwendung von Lambda-Ausdrücken in Schnittstellen synthetischeprivate
Methoden generiert werden. Mit Java 9 können Sie diese Funktion also auch für nicht synthetische und nicht Lambda-Anwendungen verwenden.Java 8 wurden hauptsächlich Standardmethoden hinzugefügt, um Lambda-Ausdrücke zu unterstützen. Die Designer (meiner Ansicht nach klug) haben beschlossen, Lambdas-Syntax für die Erstellung anonymer Implementierungen einer Schnittstelle zu erstellen. Da gegebene Lambdas jedoch nur eine einzige Methode implementieren können, wären sie auf Schnittstellen mit einer einzigen Methode beschränkt, was eine ziemlich strenge Einschränkung darstellen würde. Stattdessen wurden Standardmethoden hinzugefügt, um die Verwendung komplexerer Schnittstellen zu ermöglichen.
Wenn Sie die Behauptung,
default
die aufgrund von Lambdas eingeführt wurde, überzeugen möchten, beachten Sie, dass im Strohmann-Vorschlag des Projekts Lambda von Mark Reinhold aus dem Jahr 2009 „Erweiterungsmethoden“ als obligatorische Funktion zur Unterstützung von Lambdas erwähnt werden.Hier ist ein Beispiel, das das Konzept demonstriert:
Sehr konstruiert ist mir klar, aber ich sollte veranschaulichen, wie
default
Lambdas unterstützt werden. Da diesinverse
eine Standardeinstellung ist, kann sie bei Bedarf leicht von einer implementierenden Klasse überschrieben werden.quelle
In Java 8 wird ein neues Konzept eingeführt, das als Standardmethoden bezeichnet wird. Standardmethoden sind Methoden mit einer Standardimplementierung, die bei der Weiterentwicklung der Schnittstellen helfen, ohne den vorhandenen Code zu beschädigen. Schauen wir uns ein Beispiel an:
und die Ausgabe ist:
Do Some Work-Implementierung in der Klasse
DoSomeOtherWork-Implementierung in der Schnittstelle
quelle
Was in den anderen Antworten übersehen wurde, war seine Rolle in Anmerkungen. Bereits in Java 1.5 wurde das
default
Schlüsselwort verwendet, um einen Standardwert für ein Anmerkungsfeld bereitzustellen .Die Verwendung wurde mit der Einführung von Java 8 überlastet , damit eine Standardmethode in Schnittstellen definiert werden kann.
Etwas anderes, das übersehen wurde: Der Grund, warum die Deklaration
default class MyClass {}
ungültig ist, liegt in der Art und Weise, wie Klassen überhaupt deklariert werden . Es gibt keine Bestimmung in der Sprache, die es erlaubt, dass dieses Schlüsselwort dort angezeigt wird. Es wird jedoch für Deklarationen von Schnittstellenmethoden angezeigt.quelle
Mit der neuen Java 8- Funktion ( Standardmethoden ) kann eine Schnittstelle eine Implementierung bereitstellen, wenn sie mit dem
default
Schlüsselwort gekennzeichnet ist.Beispielsweise:
Der Schnittstellentest verwendet das Standardschlüsselwort, mit dem die Schnittstelle eine Standardimplementierung der Methode bereitstellen kann, ohne dass diese Methoden in den Klassen implementiert werden müssen, die die Schnittstelle verwenden.
Abwärtskompatibilität: Stellen Sie sich vor, Ihre Schnittstelle wird von Hunderten von Klassen implementiert. Wenn Sie diese Schnittstelle ändern, werden alle Benutzer gezwungen, die neu hinzugefügte Methode zu implementieren, obwohl dies für viele andere Klassen, die Ihre Schnittstelle implementieren, nicht unbedingt erforderlich ist.
Fakten & Einschränkungen:
1-Darf nur innerhalb einer Schnittstelle und nicht innerhalb einer Klasse oder abstrakten Klasse deklariert werden.
2-Muss einen Körper bereitstellen
3-Es wird nicht davon ausgegangen, dass es öffentlich oder abstrakt ist wie andere normale Methoden, die in einer Schnittstelle verwendet werden.
quelle
Eine sehr gute Erklärung finden Sie in den Java ™ -Tutorials . Ein Teil der Erklärung lautet wie folgt:
Stellen Sie sich ein Beispiel vor, an dem Hersteller von computergesteuerten Autos beteiligt sind, die Schnittstellen nach Industriestandard veröffentlichen, die beschreiben, welche Methoden zum Betrieb ihrer Autos aufgerufen werden können. Was ist, wenn diese computergesteuerten Autohersteller ihren Autos neue Funktionen wie den Flug hinzufügen? Diese Hersteller müssten neue Methoden festlegen, damit andere Unternehmen (z. B. Hersteller elektronischer Leitinstrumente) ihre Software an fliegende Autos anpassen können. Wo würden diese Autohersteller diese neuen flugbezogenen Methoden deklarieren? Wenn sie sie zu ihren ursprünglichen Schnittstellen hinzufügen, müssten Programmierer, die diese Schnittstellen implementiert haben, ihre Implementierungen neu schreiben. Wenn sie sie als statische Methoden hinzufügen, würden Programmierer sie als Dienstprogrammmethoden betrachten, nicht als wesentliche Kernmethoden.
Mit Standardmethoden können Sie den Schnittstellen Ihrer Bibliotheken neue Funktionen hinzufügen und die Binärkompatibilität mit Code sicherstellen, der für ältere Versionen dieser Schnittstellen geschrieben wurde.
quelle
Standardmethoden in einer Schnittstelle ermöglichen es uns, neue Funktionen hinzuzufügen, ohne alten Code zu beschädigen.
Wenn vor Java 8 einer Schnittstelle eine neue Methode hinzugefügt wurde, mussten alle Implementierungsklassen dieser Schnittstelle diese neue Methode überschreiben, auch wenn sie die neue Funktionalität nicht verwendeten.
Mit Java 8 können wir die Standardimplementierung für die neue Methode hinzufügen, indem wir das
default
Schlüsselwort vor der Methodenimplementierung verwenden.Selbst bei anonymen Klassen oder funktionalen Schnittstellen können wir Standardimplementierungen dieser Codes schreiben und sie wiederverwenden, wenn wir feststellen, dass ein Teil des Codes wiederverwendbar ist und wir nicht überall im Code dieselbe Logik definieren möchten.
Beispiel
quelle
Mit Standardmethoden können Sie den Schnittstellen Ihrer Apps neue Funktionen hinzufügen. Es kann auch für eine Mehrfachvererbung verwendet werden . Zusätzlich zu den Standardmethoden können Sie statische Methoden in Schnittstellen definieren. Dies erleichtert Ihnen das Organisieren von Hilfsmethoden
quelle