Mehrere Interfaces implementieren
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 36 von 87.
Im Gegensatz zur Klassenvererbung, bei der du nur eine Klasse erweitern kannst, erlaubt Java einer Klasse, mehrere Schnittstellen zu implementieren. So erreicht Java auf sichere Weise eine Form der Mehrfachvererbung.
Um mehrere Schnittstellen zu implementieren, liste sie nach dem Schlüsselwort implements auf, durch Kommas getrennt:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}Die Klasse muss alle Methoden aus jeder Schnittstelle implementieren, die sie deklariert. Du kannst Vererbung auch mit mehreren Schnittstellen kombinieren:
public class Square extends Shape implements Drawable, Resizable {
// Muss Methoden aus beiden Interfaces implementieren
// Kann auch geerbte Member von Shape verwenden
}Diese Flexibilität ermöglicht es dir, Klassen zu entwerfen, die mehrere Rollen erfüllen. Ein SmartPhone könnte die Schnittstellen Callable, Messageable und Browsable implementieren, die jeweils unterschiedliche Fähigkeiten definieren, die das Telefon unterstützt.
Aufgabe
EinfachErstellen wir ein intelligentes Gerätesystem, bei dem Geräte über mehrere Fähigkeiten verfügen können. Du erstellst einen SmartTV, der sowohl ein- und ausgeschaltet als auch in seiner Lautstärke gesteuert werden kann: So wird demonstriert, wie eine einzelne Klasse mehrere Schnittstellen implementieren kann, um verschiedene Rollen zu erfüllen.
Du organisierst deinen Code auf vier Dateien verteilt:
Powerable.java: Definiere eine Schnittstelle für Geräte, die ein- und ausgeschaltet werden können. Sie soll zwei Methoden deklarieren:powerOn()undpowerOff(), die beide void zurückgeben.VolumeControl.java: Definiere eine Schnittstelle für Geräte mit Lautstärkeregelung. Sie soll eine MethodesetVolume(int level)deklarieren, die void zurückgibt, sowie eine MethodegetVolume(), die einen int zurückgibt.SmartTV.java: Erstelle eine Klasse, die sowohl die SchnittstellePowerableals auch die SchnittstelleVolumeControlimplementiert. Dein SmartTV soll ein Feldbrand(String), ein FeldisOn(boolean, anfänglich false) und ein Feldvolume(int, anfänglich 0) besitzen. Füge einen Konstruktor hinzu, der den Markennamen entgegennimmt. Implementiere alle erforderlichen Methoden:powerOn()sollisOnauf true setzen und Folgendes ausgeben:[brand] TV is now ONpowerOff()sollisOnauf false setzen und Folgendes ausgeben:[brand] TV is now OFFsetVolume(int level)soll die Lautstärke aktualisieren und Folgendes ausgeben:[brand] TV volume set to [level]getVolume()soll die aktuelle Lautstärke zurückgeben
Main.java: Führe alles zusammen, um die Implementierung mehrerer Schnittstellen zu demonstrieren. Du erhältst zwei Eingaben: einen Markennamen (String) und eine Lautstärkestufe (int). Erstelle einen SmartTV mit der angegebenen Marke und:- Rufe
powerOn()auf - Rufe
setVolume()mit der angegebenen Stufe auf - Gib mithilfe von
getVolume()Folgendes aus:Current volume: [volume] - Rufe
powerOff()auf
- Rufe
Du erhältst zwei Eingaben: die TV-Marke (String) und die Lautstärkestufe (int).
Deine Ausgabe sollte vier Zeilen enthalten, die zeigen, wie dein SmartTV beide Schnittstellenverträge erfüllt. Er kann wie jedes Powerable-Gerät ein- und ausgeschaltet werden und seine Lautstärke kann wie bei jedem VolumeControl-Gerät geregelt werden!
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: Erstelle ein SmartTV mit der gegebenen Marke
// TODO: Rufe powerOn() auf
// TODO: Rufe setVolume() mit dem gegebenen Level auf
// TODO: Print: Current volume: [volume] using getVolume()
// TODO: Rufe powerOff() auf
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler