Java 8 hat eine Standardmethode hinzugefügt, die der Schnittstelle neue funktionale Funktionen hinzufügen kann, ohne die Implementierungsklasse der Schnittstelle zu beeinflussen. Veranschaulichen wir dies mit Beispielen unten.
Die Codekopie lautet wie folgt:
öffentliche Klasse Myclass implementiert interfacea {
public static void main (String [] args) {
}
@Override
public void sagt etwas () {
// Todo automatisch generierte Methode Stub
}
}
Schnittstellenschnittstelle interfacea {
öffentliche Void sagt etwas ();
}
Der obige Code zeigt, dass die MyClass -Klasse die Methode "Saythething () der Schnittstelle der Schnittstelle übernimmt. Jetzt fügen wir der Schnittstelle zwischen Sayhi () eine neue Methode hinzu. In diesem Fall kann die MyClass -Klasse nur kompiliert werden, wenn wir die Implementierungsmethode von Sayhi () bereitstellen.
Die Standardmethode ist sehr nützlich. Zum Beispiel:
Die Codekopie lautet wie folgt:
öffentliche Klasse Myclass implementiert interfacea {
public static void main (String [] args) {
}
@Override
public void sagt etwas () {
// Todo automatisch generierte Methode Stub
}
}
Schnittstellenschnittstelle interfacea {
öffentliche Void sagt etwas ();
Standard public void Sayshi () {
System.out.println ("hi");
}
}
Beachten Sie, dass wir Implementierungen aller Standardmethoden bereitstellen müssen. Daher macht die Standardmethode unseren Code flexibler und kann auch Methoden schreiben, um sie in der Schnittstelle zu implementieren. Die implementierte Methode wird als Standardmethode implementiert.
Was soll ich tun, wenn es in mehreren Schnittstellen einen Konflikt gibt?
Da Java -Klassen mehrere Schnittstellen implementieren können, kann es eine Situation geben, in der zwei oder mehr Schnittstellen eine Standard -Schnittstellenmethode mit demselben Namen haben und Konflikte verursachen. Da der Java -Virtual -Computer ausgeführt wird, wenn das Programm ausgeführt wird, ist nicht klar, welche Standardmethode Sie verwenden möchten. Dies führt zu einem Kompilierungsfehler.
Schauen wir uns das folgende Beispiel an.
Die Codekopie lautet wie folgt:
öffentliche Klasse Myclass implementiert interfacea, interfaceB {
public static void main (String [] args) {
Myclass MC = new myclass ();
Mc.Sayhi ();
}
@Override
public void sagt etwas () {
// Todo automatisch generierte Methode Stub
}
}
Schnittstellenschnittstelle interfacea {
öffentliche Void sagt etwas ();
Standard public void Sayshi () {
System.out.println ("Hi from interfacea");
}
}
Schnittstellenschnittstelle interfaceB {
Standard public void Sayshi () {
System.out.println ("Hi from interfaceB");
}
}
Es kann die Kompilierung nicht übergeben und meldet den folgenden Fehler:
"Duplizierte Standardmethoden mit dem Namen Sayhi mit den Parametern () und () werden von den Typen InterfaceB und Interfacea geerbt."
Es sei denn, die Methode Sayhi () wird in der MyClass -Klasse überschrieben:
Die Codekopie lautet wie folgt:
öffentliche Klasse Myclass implementiert interfacea, interfaceB {
public static void main (String [] args) {
Myclass MC = new myclass ();
Mc.Sayhi ();
}
@Override
public void sagt etwas () {
// Todo automatisch generierte Methode Stub
}
@Override
public void sayshi () {
System.out.println ("Implementierung von Sayhi () in MyClass");
}
}
Schnittstellenschnittstelle interfacea {
öffentliche Void sagt etwas ();
Standard public void Sayshi () {
System.out.println ("Hi from interfacea");
}
}
Schnittstellenschnittstelle interfaceB {
Standard public void Sayshi () {
System.out.println ("Hi from interfaceB");
}
}
Wenn Sie angeben möchten, welche Sayhi () -Methode der Schnittstelle aufrufen soll, können wir dies tun:
Die Codekopie lautet wie folgt:
öffentliche Klasse Myclass implementiert interfacea, interfaceB {
public static void main (String [] args) {
Myclass MC = new myclass ();
Mc.Sayhi ();
}
@Override
public void sagt etwas () {
// Todo automatisch generierte Methode Stub
}
@Override
public void sayshi () {
Interfacea.super.sayhi ();
}
}
Schnittstellenschnittstelle interfacea {
öffentliche Void sagt etwas ();
Standard public void Sayshi () {
System.out.println ("Hi from interfacea");
}
}
Schnittstellenschnittstelle interfaceB {
Standard public void Sayshi () {
System.out.println ("Hi from interfaceB");
}
}
Ist die Antwort sehr einfach?