Menu
Coddy logo textTech

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);  // true

Seit 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.

challenge icon

Aufgabe

Einfach

Lass 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 ein model-Feld (String). Füge einen Konstruktor hinzu, um es zu initialisieren, eine Getter-Methode getModel() sowie eine Methode inspect(), die Folgendes ausgibt: Inspecting vehicle: [model]
  • Car.java: Erstelle eine Klasse, die Vehicle erweitert. Autos verfügen über ein zusätzliches numDoors-Feld (int). Verwende super für die Initialisierung der übergeordneten Klasse. Füge eine Methode checkDoors() hinzu, die Folgendes ausgibt: [model] has [numDoors] doors
  • Motorcycle.java: Erstelle eine weitere Klasse, die Vehicle erweitert. Motorräder verfügen über ein hasSidecar-Feld (boolean). Füge eine Methode checkSidecar() hinzu, die abhängig vom booleschen Wert entweder [model] has a sidecar oder [model] has no sidecar ausgibt.
  • Main.java: Hier wird instanceof unverzichtbar! 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 rufe checkDoors() auf
    • Verwende instanceof, um zu prüfen, ob es sich um ein Motorcycle handelt – falls ja, führe sicher ein Downcasting durch und rufe checkSidecar() auf

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
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Java-Compiler