Java Academy · Les

De instanceof-operator

Gebruik instanceof om objecttypen vóór het casten te controleren en ClassCastException te voorkomen.

Les 3 van 413 stappen

De instanceof-operator is een gratis Java Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

De operator instanceof

De operator instanceof controleert tijdens runtime of een object een instantie van een bepaald type is. Het resultaat is true of false en de operator voorkomt ClassCastException vóór het casten.

Basisgebruik van instanceof

Gebruik instanceof om het type van een object tijdens runtime te testen voordat je een veilige cast uitvoert.

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 met overerving

instanceof geeft true terug als het object een instantie is van de klasse of een subklasse (of van een interface die het implementeert).

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

Patroonmatching met instanceof (Java 16+)

Java 16 introduceerde patroonmatching voor instanceof: je kunt in dezelfde expressie een bindingsvariabele declareren, waardoor de expliciete cast vervalt.

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
}

Patroonmatching in een methode

Patroonmatching maakt routering op basis van type overzichtelijk en veilig. De bindingsvariabele valt alleen binnen het bereik waar bekend is dat de voorwaarde waar is.

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 met null

null instanceof AnyType geeft altijd false terug — er wordt nooit een uitzondering gegooid. Daardoor is instanceof een null-veilige manier om vóór het casten te controleren.

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-expressies en patroonmatching

Java 21 breidt patroonmatching uit naar switch-expressies, zodat je zonder een keten van if-else overzichtelijk op type kunt routeren.

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 zonder instanceof

Casten zonder eerst te controleren leidt tijdens runtime tot ClassCastException — een veelvoorkomende fout in oudere code die patroonmatching helpt voorkomen.

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");
}

Praktijk: een gemengde lijst verwerken

Een toepassing uit de praktijk: een heterogene lijst met objecten verwerken met patroonmatching.

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

Verzegelde klassen en volledige matching

Verzegelde klassen (Java 17+) beperken welke klassen ze mogen uitbreiden. In combinatie met switch-patroonmatching kan de compiler controleren of alle gevallen zijn afgedekt — een standaardgeval is niet nodig.

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
    }
}

Patronen met voorwaarden

Patroonmatching ondersteunt voorwaarden met when (Java 21) om naast typecontroles ook booleaanse voorwaarden toe te voegen.

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

Korte controle

Wat levert de volgende expressie op?

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

Samenvatting: de operator instanceof

Belangrijkste punten:

  • instanceof controleert het type tijdens runtime en voorkomt ClassCastException
  • Geeft false terug voor null — gooit nooit NPE
  • Geeft true terug voor de klasse zelf en al haar subklassen/interfaces
  • Patroonmatching in Java 16+: if (x instanceof String s) combineert controle en cast
  • Een switch met patronen in Java 21 routeert overzichtelijk op type, met optionele voorwaarden
  • Verzegelde klassen en een volledige switch maken een standaardgeval overbodig
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “De instanceof-operator” gratis?

Ja — de volledige tekst van “De instanceof-operator” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “De instanceof-operator”?

Gebruik instanceof om objecttypen vóór het casten te controleren en ClassCastException te voorkomen. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “De instanceof-operator”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Primitieve typen versus referentietypen
  2. Widening- en narrowing-conversies
  3. De instanceof-operator
  4. Typecasting in de praktijk
← Terug naar Java Academy