Jede neue Java-Version unterscheidet sich von den vorherigen. Ein Beispiel für eine solche Änderung gegenüber dem von uns behandelten Material ist, dass es die Sprache vor Java 5 nicht gab enums.
Standardmethoden in Schnittstellen - 1
Nur so: Java 8 unterscheidet sich deutlich von Java 7. Wichtige Neuerungen werden wir natürlich nicht außer Acht lassen. Da wir in dieser Lektion über Schnittstellen sprechen, betrachten wir eine Aktualisierung der Sprache: Standardmethoden in Schnittstellen . Sie wissen bereits, dass eine Schnittstelle kein Verhalten implementiert . Sein Zweck besteht darin, zu beschreiben, welches Verhalten in allen Objekten vorhanden sein muss, die die Schnittstelle implementieren . Doch Entwickler stießen häufig auf Situationen, in denen die Implementierung einer Methode in allen Klassen gleich war. Schauen wir uns unser altes Autobeispiel an:

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 go() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class F1Car implements Car {
   @Override
   public void go() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
Was ist Ihrer Meinung nach das Hauptproblem bei diesem Code? Sie haben wahrscheinlich bemerkt, dass wir eine Menge doppelten Code geschrieben haben! Dies ist ein häufiges Problem bei der Programmierung und sollte vermieden werden. Eine andere Sache ist, dass es vor der Veröffentlichung von Java 8 keine speziellen Lösungen gab. Mit der Veröffentlichung dieser Version wurde es möglich, Standardmethoden zu definieren und sie direkt in einer Schnittstelle zu implementieren! So geht's:

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, in die Schnittstelle verschoben, sodass kein doppelter Code erforderlich ist. Und die Methoden sind 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 gas()Methode gibt, von denen aber nur 99 das gleiche Verhalten haben sollen? Verdirbt das alles? Funktioniert eine Standardmethode in diesem Fall nicht? Natürlich nicht :) Standardschnittstellenmethoden können überschrieben werden.

public class UnusualCar implements Car {
   @Override
   public void go() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car slows down differently!");
   }
}
Alle anderen 99 Fahrzeugtypen verwenden die Standardmethode, während dieUnusualCarKlasse ist eine Ausnahme. Ohne das Gesamtbild zu verderben, wird es in aller Ruhe sein eigenes Verhalten definieren. Mehrfachvererbung in Schnittstellen. Wie Sie bereits wissen, gibt es in Java keine Mehrfachvererbung. Dafür gibt es viele Gründe. Wir werden sie in einer separaten Lektion ausführlich betrachten. In anderen Sprachen wie C++ ist die Situation umgekehrt. Keine Mehrfachvererbung stellt eine ernsthafte Herausforderung dar, da dasselbe Objekt mehrere unterschiedliche Eigenschaften und Verhaltensweisen aufweisen kann. Zum Beispiel sind wir für unsere Eltern Kinder, für unsere Lehrer Schüler und für unsere Ärzte Patienten. Im wirklichen Leben übernehmen wir verschiedene Rollen und verhalten uns dementsprechend unterschiedlich: Natürlich interagieren wir mit Lehrern 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. Ein Teich braucht schwimmende Vögel, während eine Voliere fliegende Vögel braucht. Um dies darzustellen, haben wir zwei Basisklassen erstellt:FlyingBirdund Waterfowl.

public class Waterfowl {
}

public class FlyingBird {
}
Dementsprechend werden wir Vögel, die erben, FlyingBirdin die Voliere schicken, während diejenigen, die davon abstammen, Waterfowlin den Teich gehen. Alles scheint unkompliziert. Aber was sollen wir tun, wenn wir irgendwo eine Ente definieren müssen? Enten schwimmen und fliegen. Aber wir haben keine Mehrfachvererbung. Glücklicherweise unterstützt Java mehrere Implementierungen von Schnittstellen. Wenn eine Klasse nicht mehrere Eltern erben kann, ist die Implementierung mehrerer Schnittstellen einfach! FlyingBirdUnsere Ente kann sowohl ein fliegender als auch ein schwimmender Vogel sein :) Um das gewünschte Ergebnis zu erzielen, müssen wir lediglich und- WaterfowlSchnittstellen anstelle von Klassen erstellen .

public class Duck implements FlyingBird, Waterfowl {

   // Methods of both interfaces combine easily into one class
  
   @Override
   public void fly() {
       System.out.println("Flying!");
   }

   @Override
   public void swim() {

       System.out.println("Swimming!");
   }
}
Dies bedeutet, dass unser Programm die Möglichkeit behält, den Unterricht flexibel zu verwalten. Wenn wir das mit Standardmethoden kombinieren, werden unsere Möglichkeiten, das Verhalten von Objekten zu bestimmen, nahezu unbegrenzt! :) :)