JavaRush /Java-Blog /Random-DE /Standardmethoden in Schnittstellen

Standardmethoden in Schnittstellen

Veröffentlicht in der Gruppe Random-DE
Jede neue Java-Version unterscheidet sich von den vorherigen. Hier ist ein Beispiel für die Änderungen gegenüber dem von uns behandelten Material: Vor Java 5 gab es enumin der Sprache keine „s“.
Standardmethoden in Schnittstellen - 1
Ebenso unterscheidet sich Java 8 deutlich von Java 7. Die meisten unserer Vorträge sind in der 7. Version der Sprache verfasst, aber natürlich werden wir wichtige Neuerungen nicht außer Acht lassen. Da wir in dieser Vorlesung über Schnittstellen sprechen, werfen wir einen Blick auf ein Update – Standardmethoden in Schnittstellen . Sie wissen bereits, dass eine Schnittstelle nicht implementiert ist . Seine Aufgabe besteht darin, zu beschreiben, welches Verhalten alle Objekte haben sollen, die es implementieren . Allerdings stießen Entwickler häufig auf Situationen, in denen die Implementierung einer Methode in allen Klassen gleich war. Schauen wir uns unser Beispiel eines alten Autos an:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
Was ist Ihrer Meinung nach das Hauptproblem bei diesem Code? Sie haben wahrscheinlich bemerkt, dass wir eine Menge desselben Codes geschrieben haben! Dieses Problem tritt häufig beim Programmieren auf und sollte vermieden werden. Hinzu kommt, dass es vor der Veröffentlichung von Java 8 keine speziellen Lösungsmöglichkeiten gab. Mit der Veröffentlichung dieser Version wurde es möglich, Standardmethoden zu definieren und diese direkt in der Schnittstelle zu implementieren! So wird es gemacht:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Jetzt sind die Methoden gas()und brake(), die für alle Maschinen gleich waren, in der Schnittstelle enthalten und es ist kein doppelter Code erforderlich. Darüber hinaus sind die Methoden in jeder der Klassen 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 einer Methode gibt gas(), aber nur 99 davon das gleiche Verhalten aufweisen? Das macht alles kaputt und die Standardmethode funktioniert in diesem Fall nicht? Natürlich nicht :) Standardmethoden von Schnittstellen können überschrieben werden.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Alle anderen 99 Maschinentypen implementieren die Standardmethode, und die Klasse UnusualCar– die Ausnahme – wird das Gesamtbild nicht beeinträchtigen und in aller Ruhe ihr Verhalten bestimmen. Mehrfachvererbung in Schnittstellen Wie Sie bereits wissen, gibt es in Java keine Mehrfachvererbung. Dafür gibt es viele Gründe, auf die wir in einem gesonderten Vortrag ausführlich eingehen werden. In anderen Sprachen, beispielsweise in C++, ist es umgekehrt. Ohne Mehrfachvererbung entsteht ein ernstes Problem: Das gleiche Objekt kann eine Reihe unterschiedlicher Eigenschaften und „Verhaltensweisen“ aufweisen. Ein Beispiel aus dem Leben: Für unsere Eltern sind wir Kinder, für Lehrer sind wir Schüler, für Ärzte sind wir Patienten. Im Leben treten wir in unterschiedlichen Rollen auf und verhalten uns dementsprechend unterschiedlich: Mit Lehrern reden wir natürlich anders als mit engen Freunden. Versuchen wir, diese Situation in Code zu übersetzen. Stellen wir uns vor, wir hätten zwei Klassen: Teich und Voliere. Für einen Teich braucht man schwimmende Vögel, für eine Voliere braucht man fliegende Vögel. Zu diesem Zweck haben wir zwei Basisklassen erstellt – FlyingBirdund Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
Dementsprechend werden wir diejenigen Vögel, deren Klassen von geerbt wurden FlyingBird, in die Voliere schicken, und diejenigen, die von abstammen, in den Teich schicken Waterfowl. Alles scheint einfach. Aber was machen wir, wenn wir die Ente irgendwo identifizieren müssen? Sie schwimmt und fliegt zugleich. Aber wir haben keine Mehrfachvererbung. Glücklicherweise bietet Java mehrere Implementierungen von Schnittstellen. Wenn eine Klasse nicht von mehreren Eltern erben kann, ist die Implementierung mehrerer Schnittstellen einfach! Unsere Ente kann sowohl fliegen als auch schwimmen :) Es reicht aus, Schnittstellen FlyingBirdanstelle Waterfowlvon Klassen zu verwenden, um das gewünschte Ergebnis zu erzielen.
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Dadurch behält unser Programm die flexible Klassenverwaltung bei und in Kombination mit der Implementierung von Standardmethoden werden unsere Möglichkeiten, das Verhalten von Objekten zu definieren, nahezu grenzenlos! :) :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION