Jede neue Java-Version unterscheidet sich von den vorherigen. Hier ist ein Beispiel für Änderungen im Material, die wir behandelt haben: Vor Java 5 gab es in der Sprache keine
Ebenso unterscheidet sich Java 8 deutlich von Java 7. Die meisten unserer Lektionen wurden für die 7. Version der Sprache geschrieben, aber natürlich werden wir wichtige Neuerungen nicht außer Acht lassen. Da wir in dieser Lektion bereits über Schnittstellen sprechen, betrachten wir ein Update – Standardmethoden in Schnittstellen . Sie wissen bereits, dass eine Schnittstelle kein Verhalten implementiert . Seine Aufgabe besteht darin, das Verhalten zu beschreiben, das alle Objekte haben müssen, die es implementieren. Entwickler sind jedoch häufig auf Situationen gestoßen, in denen die Implementierung einer Methode in allen Klassen gleich ist. Betrachten wir unser Beispiel eines alten Autos:
enum
s. ![Standardmethoden in Schnittstellen - 1](https://cdn.codegym.cc/images/article/34d25d0e-f8da-43f7-ab2b-5333c5a01585/800.jpeg)
public interface Car {
public void gas();
public void brake();
}
public class Sedan implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class Truck implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class F1Car implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
„Was ist Ihrer Meinung nach das Hauptproblem bei diesem Code? Ihnen ist wahrscheinlich aufgefallen, dass wir eine Menge sich wiederholenden Codes geschrieben haben! Dieses Problem kommt in der Programmierung häufig vor und Sie müssen es vermeiden. Eine andere Sache ist, dass bestimmte Lösungen vorher nicht existierten.“ Java 8 wurde veröffentlicht. Mit dieser Version gab es die Möglichkeit, Standardmethoden anzugeben und diese direkt in der Schnittstelle zu implementieren! So machen Sie das:
public interface Car {
public default void gas() {
System.out.println("Gas!");
}
public default void brake() {
System.out.println("Brake!");
}
}
public class Sedan implements Car {
}
public class Truck implements Car {
}
public class F1Car implements Car {
}
Jetzt wurden die gas()
und- brake()
Methoden, die für alle Autos gleich waren, auf die Schnittstelle verschoben. Es ist kein wiederholter Code erforderlich. Darüber hinaus sind die Methoden in jeder Klasse verfügbar!
public class Main {
public static void main(String[] args) {
F1Car f1Car = new F1Car();
Sedan sedan = new Sedan();
Truck truck = new Truck();
truck.gas();
sedan.gas();
f1Car.brake();
}
}
Was ist, wenn es 100 Klassen mit der gas()
Methode gibt, aber nur 99 davon das gleiche Verhalten aufweisen? Ruiniert das alles und macht die Standardmethode für diese Situation ungeeignet? Natürlich nicht :) Standardmethoden in Schnittstellen können auf die gleiche Weise überschrieben werden wie gewöhnliche.
public class UnusualCar implements Car {
@Override
public void gas() {
System.out.println("This car accelerates differently!");
}
@Override
public void brake() {
System.out.println("This car decelerates differently!");
}
}
Alle 99 anderen Fahrzeugtypen implementieren die Standardmethode und dieUnusualCar
Die Klasse, die eine Ausnahme darstellt, beeinträchtigt nicht das Gesamtbild und definiert ruhig ihr eigenes Verhalten. Mehrfachvererbung von Schnittstellen. Wie Sie bereits wissen, unterstützt Java keine Mehrfachvererbung. Dafür gibt es viele Gründe. Wir werden sie in einer separaten Lektion im Detail betrachten. Andere Sprachen wie C++ unterstützen es. Ohne Mehrfachvererbung entsteht ein ernstes Problem: Ein Objekt kann mehrere unterschiedliche Eigenschaften und „Verhaltensweisen“ haben. Hier ein Beispiel aus dem Leben: Für unsere Eltern sind wir Kinder, für unsere Lehrer Schüler und für unsere Ärzte Patienten. Im Leben übernehmen wir unterschiedliche Rollen und verhalten uns dementsprechend unterschiedlich: Natürlich würden wir mit Lehrern nicht auf die gleiche Weise sprechen wie mit unseren engen Freunden. Versuchen wir, dies in Code zu übersetzen. Stellen Sie sich vor, wir haben zwei Klassen: Teich und Voliere. Für den Teich brauchen wir Wasservögel; Für die Voliere brauchen wir fliegende Vögel. Zu diesem Zweck haben wir zwei Basisklassen erstellt:FlyingBird
und Waterfowl
.
public class Waterfowl {
}
public class FlyingBird {
}
Dementsprechend schicken wir Vögel, deren Klassen erben, FlyingBird
in die Voliere, und wir schicken Vögel, die erben, Waterfowl
in den Teich. Es scheint alles sehr einfach zu sein. Aber wohin schicken wir eine Ente? Es schwimmt und fliegt. Und wir haben keine Mehrfachvererbung. Glücklicherweise unterstützt Java die mehrfache Implementierung von Schnittstellen. Obwohl eine Klasse nicht mehrere Eltern erben kann, kann sie problemlos mehrere Schnittstellen implementieren! Unsere Ente kann sowohl ein fliegender Vogel als auch ein Wasservogel sein :) Wir müssen lediglich Schnittstellen FlyingBird
und Waterfowl
statt Klassen erstellen, um das gewünschte Ergebnis zu erzielen.
public class Duck implements FlyingBird, Waterfowl {
// The methods of both interfaces can be easily combined into one class
@Override
public void fly() {
System.out.println("Fly!");
}
@Override
public void swim() {
System.out.println("Swim!");
}
}
Dementsprechend behält unser Programm die Flexibilität von Klassen bei und in Kombination mit Standardmethoden werden unsere Möglichkeiten, das Verhalten von Objekten zu definieren, nahezu unbegrenzt! :) :)