Der instanceof-Operator
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 31 von 87.
Die vorherige Lektion hat gezeigt, dass Downcasting mit einer ClassCastException fehlschlagen kann, wenn das Objekt nicht tatsächlich der Typ ist, in den du es umwandelst. Der Operator instanceof löst dieses Problem, indem er dir ermöglicht, den Typ eines Objekts vor der Umwandlung zu überprüfen.
Die Syntax ist unkompliziert: object instanceof ClassName gibt true zurück, wenn das Objekt eine Instanz dieser Klasse (oder einer ihrer Unterklassen) ist:
Animal animal = new Dog();
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark(); // Sicher, Dog-spezifische Methoden aufzurufen
}Diese Prüfung verhindert Laufzeitfehler, indem sie sicherstellt, dass der cast erfolgreich sein wird. Der Operator gibt für übergeordnete Typen in der Hierarchie ebenfalls true zurück:
Dog dog = new Dog();
System.out.println(dog instanceof Dog); // true
System.out.println(dog instanceof Animal); // true
System.out.println(dog instanceof Object); // trueSeit Java 16 kannst du die Prüfung und das Casten in einem Schritt mithilfe von Pattern Matching kombinieren:
if (animal instanceof Dog dog) {
dog.bark(); // 'dog' ist bereits gecastet und einsatzbereit
}Diese übersichtlichere Syntax macht die separate Cast-Zeile überflüssig. Beachte, dass instanceof bei der Prüfung gegen null false zurückgibt, sodass du keine separate Nullprüfung benötigst.
Aufgabe
EinfachLass uns ein Fahrzeug-Inspektionssystem erstellen, das den Operator instanceof verwendet, um verschiedene Fahrzeugtypen sicher zu erkennen und zu behandeln. Du wirst eine Hierarchie von Fahrzeugen erstellen und Code schreiben, der den tatsächlichen Typ jedes Fahrzeugs überprüft, bevor auf seine speziellen Funktionen zugegriffen wird.
Du wirst deinen Code auf vier Dateien verteilen:
Vehicle.java: Erstelle die Basisklasse, die alle Fahrzeuge gemeinsam haben. Jedes Fahrzeug verfügt über einmodel-Feld (String). Füge einen Konstruktor hinzu, um es zu initialisieren, eine Getter-MethodegetModel()sowie eine Methodeinspect(), die Folgendes ausgibt:Inspecting vehicle: [model]Car.java: Erstelle eine Klasse, die Vehicle erweitert. Autos verfügen über ein zusätzlichesnumDoors-Feld (int). Verwendesuperfür die Initialisierung der übergeordneten Klasse. Füge eine MethodecheckDoors()hinzu, die Folgendes ausgibt:[model] has [numDoors] doorsMotorcycle.java: Erstelle eine weitere Klasse, die Vehicle erweitert. Motorräder verfügen über einhasSidecar-Feld (boolean). Füge eine MethodecheckSidecar()hinzu, die abhängig vom booleschen Wert entweder[model] has a sidecaroder[model] has no sidecarausgibt.Main.java: Hier wirdinstanceofunverzichtbar! Du erhältst vier Eingaben: ein Automodell, die Anzahl der Türen, ein Motorradmodell und die Information, ob es einen Beiwagen hat (true/false).Erstelle ein Array von
Vehicle-Referenzen, das ein Car und ein Motorcycle enthält. Durchlaufe anschließend das Array und führe für jedes Fahrzeug Folgendes aus:- Rufe die Basismethode
inspect()auf - Verwende
instanceof, um zu prüfen, ob es sich um ein Car handelt – falls ja, führe sicher ein Downcasting durch und rufecheckDoors()auf - Verwende
instanceof, um zu prüfen, ob es sich um ein Motorcycle handelt – falls ja, führe sicher ein Downcasting durch und rufecheckSidecar()auf
- Rufe die Basismethode
Du erhältst vier Eingaben: das Automodell (String), die Anzahl der Türen (int), das Motorradmodell (String) und has sidecar (boolean).
Deine Ausgabe sollte vier Zeilen enthalten – für jedes Fahrzeug siehst du seine Inspektionsmeldung, gefolgt von der typspezifischen Prüfung. Der Operator instanceof stellt sicher, dass du Car-Methoden nur bei tatsächlichen Cars und Motorcycle-Methoden nur bei tatsächlichen Motorcycles aufrufst, und verhindert so jede ClassCastException!
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String carModel = scanner.nextLine();
int numDoors = Integer.parseInt(scanner.nextLine());
String motorcycleModel = scanner.nextLine();
boolean hasSidecar = Boolean.parseBoolean(scanner.nextLine());
// TODO: Erstelle ein Car-Objekt mit carModel und numDoors
// TODO: Erstelle ein Motorcycle-Objekt mit motorcycleModel und hasSidecar
// TODO: Erstelle ein Array von Vehicle-Referenzen, das das Car und das Motorcycle enthält
// TODO: Durchlaufe das Array und für jedes vehicle:
// 1. Rufe die Methode inspect() auf
// 2. Verwende instanceof, um zu prüfen, ob es ein Car ist, dann downcaste und rufe checkDoors() auf
// 3. Verwende instanceof, um zu prüfen, ob es ein Motorcycle ist, dann downcaste und rufe checkSidecar() 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