0Pricing
Java Academy · Lektion

Der instanceof-Operator

Verwenden Sie instanceof, um Objekttypen vor dem Cast zu prüfen und ClassCastException zu vermeiden.

Der instanceof-Operator ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Der instanceof-Operator

Der Operator instanceof prüft zur Laufzeit, ob ein Objekt eine Instanz eines bestimmten Typs ist. Er liefert true oder false und verhindert vor dem Casting eine ClassCastException.

Grundlegende Verwendung von instanceof

Verwenden Sie instanceof, um den Laufzeittyp eines Objekts zu prüfen, bevor Sie einen sicheren Cast durchführen.

Object obj = "Hello, Java!";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.toUpperCase()); // HELLO, JAVA!
}

Object num = Integer.valueOf(42);
System.out.println(num instanceof Integer); // true
System.out.println(num instanceof String);  // false

instanceof bei Vererbung

instanceof liefert true, wenn das Objekt eine Instanz der Klasse oder einer beliebigen Unterklasse (beziehungsweise eines implementierten Interfaces) ist.

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

Animal a = new Dog();

System.out.println(a instanceof Animal); // true
System.out.println(a instanceof Dog);    // true
System.out.println(a instanceof Cat);    // false

Pattern Matching mit instanceof (Java 16+)

Java 16 führte Pattern Matching für instanceof ein: Sie können eine Binding-Variable im selben Ausdruck deklarieren und dadurch den expliziten Cast vermeiden.

Object shape = "circle";

// Old way
if (shape instanceof String) {
    String s = (String) shape;
    System.out.println(s.length());
}

// New way (Java 16+) — binding variable 's' is in scope
if (shape instanceof String s) {
    System.out.println(s.length()); // 6
}

Pattern Matching in einer Methode

Pattern Matching ermöglicht eine übersichtliche und sichere ty basiertierte Verteilung. Die Binding-Variable ist nur dort gültig, wo bekannt ist, dass die Bedingung wahr ist.

sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}

static double area(Shape s) {
    if (s instanceof Circle c) {
        return Math.PI * c.radius() * c.radius();
    } else if (s instanceof Rectangle r) {
        return r.width() * r.height();
    }
    throw new IllegalArgumentException("Unknown shape");
}

System.out.println(area(new Circle(5)));         // 78.53...
System.out.println(area(new Rectangle(4, 6)));   // 24.0

instanceof mit null

null instanceof AnyType liefert immer false – es wird nie eine Exception ausgelöst. Dadurch ist instanceof eine null-sichere Möglichkeit, vor dem Casting eine Prüfung durchzuführen.

String s = null;
System.out.println(s instanceof String); // false (not NPE)

Object o = null;
if (o instanceof Number n) {
    System.out.println(n.intValue());
} else {
    System.out.println("Not a number (or null)"); // prints this
}

Switch-Ausdrücke und Pattern Matching

Java 21 erweitert Pattern Matching auf Switch-Ausdrücke und ermöglicht dadurch eine übersichtliche typspezifische Verzweigung ohne verkettete if-else-Anweisungen.

static String describe(Object obj) {
    return switch (obj) {
        case Integer i -> "Integer: " + i;
        case Double d  -> "Double: " + d;
        case String s  -> "String of length " + s.length();
        case null      -> "null value";
        default        -> "Unknown: " + obj.getClass().getSimpleName();
    };
}

System.out.println(describe(42));       // Integer: 42
System.out.println(describe(3.14));     // Double: 3.14
System.out.println(describe("hello")); // String of length 5
System.out.println(describe(null));     // null value

ClassCastException ohne instanceof

Casting ohne vorherige Prüfung führt zur Laufzeit zu einer ClassCastException – ein häufiger Fehler in älterem Code, den Pattern Matching verhindern kann.

Object obj = "I am a String";

try {
    Integer i = (Integer) obj; // ClassCastException!
} catch (ClassCastException e) {
    System.out.println("Cannot cast String to Integer");
}

// Safe version
if (obj instanceof Integer i) {
    System.out.println("Is integer: " + i);
} else {
    System.out.println("Not an integer");
}

Praxis: Verarbeiten einer gemischten Liste

Ein praxisnaher Anwendungsfall: Verarbeiten einer heterogenen Liste von Objekten mithilfe von Pattern Matching.

import java.util.List;

List<Object> events = List.of(
    "User login", 42, 3.14, "Payment processed", 100
);

double numericSum = 0;
for (Object e : events) {
    if (e instanceof Integer n) numericSum += n;
    else if (e instanceof Double d) numericSum += d;
    else if (e instanceof String s) System.out.println("Log: " + s);
}
System.out.printf("Numeric sum: %.2f%n", numericSum); // 145.14

Versiegelte Klassen und vollständiges Matching

Versiegelte Klassen (Java 17+) schränken ein, welche Klassen von ihnen erben dürfen. In Kombination mit einem Pattern-Matching-Switch kann der Compiler die Vollständigkeit prüfen – ein default-Fall ist nicht erforderlich.

sealed interface Notification permits EmailNotification, SmsNotification {}
record EmailNotification(String to, String body) implements Notification {}
record SmsNotification(String phone, String text) implements Notification {}

static void send(Notification n) {
    switch (n) {
        case EmailNotification e ->
            System.out.println("Email to " + e.to() + ": " + e.body());
        case SmsNotification s ->
            System.out.println("SMS to " + s.phone() + ": " + s.text());
        // no default needed — compiler knows all cases are covered
    }
}

Bewachte Patterns

Pattern Matching unterstützt mit when (Java 21) Guards, um neben Typprüfungen auch boolesche Bedingungen hinzuzufügen.

static String classify(Number n) {
    return switch (n) {
        case Integer i when i < 0  -> "negative int: " + i;
        case Integer i when i == 0 -> "zero";
        case Integer i             -> "positive int: " + i;
        case Double d              -> "double: " + d;
        default                    -> "other number";
    };
}

System.out.println(classify(-5));  // negative int: -5
System.out.println(classify(0));   // zero
System.out.println(classify(7));   // positive int: 7

Schnelltest

Was liefert der folgende Ausdruck zurück?

Object obj = null;
boolean result = obj instanceof String;
System.out.println(result);

Zusammenfassung: instanceof-Operator

Die wichtigsten Erkenntnisse:

  • instanceof prüft den Laufzeittyp und verhindert ClassCastException
  • Für null wird false zurückgegeben – es wird nie eine NPE ausgelöst
  • Für die Klasse selbst und alle ihre Unterklassen beziehungsweise Interfaces wird true zurückgegeben
  • Pattern Matching ab Java 16: if (x instanceof String s) kombiniert Prüfung und Cast
  • Ein Switch mit Patterns ab Java 21 verzweigt übersichtlich nach Typ und unterstützt optionale Guards
  • Versiegelte Klassen und ein vollständiger Switch machen einen default-Fall überflüssig

Häufig gestellte Fragen

Ist die Lektion „Der instanceof-Operator“ kostenlos?

Ja — der vollständige Text von „Der instanceof-Operator“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Der instanceof-Operator“?

Verwenden Sie instanceof, um Objekttypen vor dem Cast zu prüfen und ClassCastException zu vermeiden. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Der instanceof-Operator“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Primitive Datentypen vs. Referenztypen
  2. Verbreiterungs- und Verengungskonvertierungen
  3. Der instanceof-Operator
  4. Typ-Casting in der Praxis
← Zurück zu Java Academy