Was ist die Standardmethode?
Nachdem Java 8 veröffentlicht wurde, können der Schnittstelle neue Methoden hinzugefügt werden, aber die Schnittstelle kann weiterhin mit ihrer Implementierungsklasse kompatibel sein. Dies ist sehr wichtig, da die von Ihnen entwickelnde Klassenbibliothek möglicherweise von mehreren Entwicklern häufig verwendet wird. Bevor Java 8, nachdem eine Schnittstelle in der Klassenbibliothek veröffentlicht worden war,, wenn eine neue Methode zur Schnittstelle hinzugefügt wurde, besteht die Anwendungen, die diese Schnittstelle implementieren, das Risiko eines Absturzes mit der neuen Version der Schnittstelle.
Gibt es bei Java 8 keine solche Gefahr nicht? Die Antwort ist nein.
Durch das Hinzufügen einer Standardmethode zu einer Schnittstelle kann einige Implementierungsklassen nicht verfügbar sein.
Schauen wir uns zunächst die Details der Standardmethode an.
In Java 8 können Methoden in Schnittstellen implementiert werden (die statischen Methoden in Java 8 können auch in Schnittstellen implementiert werden, dies ist jedoch ein weiteres Thema). Die in der Schnittstelle implementierte Methode wird als Standardmethode bezeichnet, die durch das Schlüsselwort Standard als Modifikator identifiziert wird. Wenn eine Klasse eine Schnittstelle implementiert, können Sie Methoden implementieren, die in der Schnittstelle implementiert wurden, dies ist jedoch nicht erforderlich. Diese Klasse erbt die Standardmethode. Aus diesem Grund muss die Implementierungsklasse, wenn sich die Schnittstelle ändert, nicht geändert werden.
Was ist mit der Zeit, mehr zu erben?
Dinge werden kompliziert, wenn eine Klasse mehr als eine (z. B. zwei) Schnittstellen implementiert und diese Schnittstellen die gleiche Standardmethode haben. Welche Standardmethode erbt die Klasse? Keiner von ihnen ist! In diesem Fall muss die Klasse die Standardmethode (nur) für sich selbst implementieren (direkt oder die höheren Klassen auf dem Baum erben oder erben).
Gleiches gilt, wenn eine Schnittstelle die Standardmethode implementiert und die andere Schnittstelle die Standardmethode als abstrakt deklariert. Java 8 versucht, unklare Dinge zu vermeiden und es streng zu halten. Wenn eine Methode in mehreren Schnittstellen deklariert wird, wird eine Standardimplementierung nicht vererbt, und Sie erhalten einen Kompilierungs-Zeit-Fehler.
Wenn Sie jedoch Ihre Klasse zusammengestellt haben, gibt es keine Kompilierungs-Zeitfehler. Zu diesem Zeitpunkt ist Java 8 inkonsistent. Es hat aus verschiedenen Gründen seine eigenen Gründe. Ich möchte hier nicht ausführlich erklären oder diskutieren (weil: Die Version wurde veröffentlicht und die Diskussion ist zu lang und diese Plattform hat sie nie so besprochen).
Die Klasse kann normalerweise im obigen Fall ausgeführt werden. Es kann jedoch nicht mit modifizierten Schnittstellen neu kompiliert werden, aber es kann trotzdem mit alten Schnittstellen ausgeführt werden. Nächste
Wenn beide Schnittstellen Standardimplementierungen für dieselbe Methode liefern, kann diese Methode nur aufgerufen werden, es sei denn, die Implementierungsklasse implementiert auch die Standardmethode (entweder implementiert sie direkt oder vererbt die höhere Klasse auf dem Baum für die Implementierung).
Diese Klasse ist jedoch kompatibel. Es kann mit neuen Schnittstellen geladen oder sogar ausgeführt werden, solange es keine Methode aufnimmt, die in beiden Schnittstellen eine Standardimplementierung aufweist.
Beispielcode
Um das obige Beispiel zu demonstrieren, habe ich ein Testverzeichnis für C.Java erstellt, das unten 3 Unterverzeichnisse verfügt, die zum Speichern von i1.java und i2.java verwendet werden. Das Testverzeichnis enthält den Quellcode von C.Java von Klasse C. Das Basisverzeichnis enthält die Schnittstelle zur Version, die kompiliert und ausgeführt werden kann. I1 enthält die standardmäßige M -Methode, und I2 enthält keine Methoden.
Die Implementierungsklasse enthält die Hauptmethode, sodass wir sie im Test ausführen können. Es wird überprüft, ob es Befehlszeilenparameter gibt, damit wir Tests, die M () aufrufen und nicht M () aufrufen können, problemlos durchführen können.
public class c implementiert i1, i2 {public static void main (String [] args) {c c = new C (); if (args.length == 0) {cm (); }}} public interface i1 {Standard void m () {System.out.println ("Hallo Schnittstelle 1"); }} öffentliche Schnittstelle I2 {}Verwenden Sie die folgende Befehlszeile, um zu kompilieren und auszuführen:
Javac -cp .: Basis C.Javajava -cp .: Basis -Chello -Schnittstelle 1
Das kompatible Verzeichnis enthält die I2 -Schnittstelle mit der abstrakten Methode m () und der nicht modifizierten I1 -Schnittstelle.
öffentliche Schnittstelle I2 {void m ();}Dies kann nicht verwendet werden, um die Klasse C zu kompilieren:
Javac -cp .: Kompatible C.Javac.java:1: Fehler: C ist nicht abstrakt und überschreibt die abstrakte Methode m () in der I2Public -Klasse C implementiert I1, I2 { ^ 1 FehlerDie Fehlermeldung ist sehr genau. Da die C. -Klasse aus der vorherigen Zusammenstellung erhalten wird, erhalten wir, wenn wir die Schnittstelle im kompatiblen Verzeichnis kompilieren, weiterhin zwei Schnittstellen, die die Implementierungsklasse ausführen können:
Javac kompatibel/i*.javajava -cp .: kompatible Chello -Schnittstelle 1
Das dritte Verzeichnis, das als falsch bezeichnet wird, und die I2 -Schnittstelle definiert auch die m () -Methode:
public interface i2 {Standard void m () {System.out.println ("Hallo Schnittstelle 2"); }}Wir sollten niemals müde werden, es zusammenzustellen. Obwohl die m () -Methode zweimal definiert ist, kann die Implementierungsklasse immer noch ausgeführt werden, solange sie die Methode, die mehrmals definiert wurde, nicht aufgerufen wird, aber solange wir die m () -Methode aufrufen, fällt sie sofort aus. Hier sind die Befehlszeilenparameter, die wir verwenden:
Javac falsch/*. Javajava -cp.
abschließend
Wenn Sie die Klassenbibliothek portieren, die die Standardimplementierung zur Schnittstelle zur Umgebung Java 8 hinzufügt, wird es im Allgemeinen kein Problem geben. Zumindest ist dies das, was die Bibliotheksentwickler der Java8 -Klasse für die Hinzufügung von Standardmethoden zu den Sammlungsklassen denken. Anwendungen, die Ihre Klassenbibliothek verwenden, beruhen immer noch auf die Klassenbibliothek von Java7 ohne die Standardmethode. Bei der Verwendung und Änderung mehrerer verschiedener Klassenbibliotheken besteht eine geringe Konfliktchance. Wie kann ich es vermeiden?
Entwerfen Sie Ihre Klassenbibliothek wie zuvor. Nehmen Sie es nicht leicht, wenn Sie sich möglicherweise auf die Standardmethode verlassen. Verwenden Sie es nicht als unbedingt notwendig. Wählen Sie den Methodennamen mit Bedacht aus, um Konflikte mit anderen Schnittstellen zu vermeiden. Wir werden lernen, wie Sie diese Funktion für die Entwicklung in der Java -Programmierung verwenden.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.