Operatoren instanceof
Brug instanceof til at kontrollere objekttyper før casting og undgå ClassCastException.
Operatoren instanceof er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Operatoren instanceof
Operatoren instanceof kontrollerer ved kørsel, om et objekt er en instans af en bestemt type. Den returnerer true eller false og forhindrer ClassCastException før casting.
Grundlæggende brug af instanceof
Brug instanceof til at kontrollere et objekts type ved kørsel, før du udfører et sikkert cast.
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); // falseinstanceof med nedarvning
instanceof returnerer true, hvis objektet er en instans af klassen eller en hvilken som helst underklasse (eller en implementeret grænseflade).
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); // falseMønstermatchning med instanceof (Java 16+)
Java 16 introducerede mønstermatchning for instanceof: Du kan erklære en bindingsvariabel i det samme udtryk og dermed undgå det eksplicitte cast.
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
}Mønstermatchning i en metode
Mønstermatchning gør typebaseret fordeling enkel og sikker. Bindingsvariablen er kun tilgængelig i det gyldighedsområde, hvor betingelsen er kendt for at være sand.
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.0instanceof med null
null instanceof AnyType returnerer altid false — der kastes aldrig en fejl. Det gør instanceof til en null-sikker måde at kontrollere typen på før casting.
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-udtryk og mønstermatchning
Java 21 udvider mønstermatchning til switch-udtryk, så du kan fordele efter type på en enkel måde uden kædede if-else-udtryk.
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 valueClassCastException uden instanceof
Hvis du caster uden først at kontrollere typen, får du ClassCastException ved kørsel — en almindelig fejl i ældre kode, som mønstermatchning kan hjælpe med at forhindre.
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");
}Praktisk eksempel: Behandling af en blandet liste
Et eksempel fra virkelige programmer: Behandl en heterogen liste med objekter ved hjælp af mønstermatchning.
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.14Forseglede klasser og komplet matchning
Forseglede klasser (Java 17+) begrænser, hvilke klasser der må nedarve fra dem. Kombineret med switch og mønstermatchning kan kompileren kontrollere, at alle tilfælde er dækket — der er ikke brug for en default-case.
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
}
}Mønstre med vagtbetingelser
Mønstermatchning understøtter vagtbetingelser med when (Java 21), så du kan tilføje booleske betingelser sammen med typekontroller.
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: 7Hurtigt tjek
Hvad returnerer følgende udtryk?
Object obj = null; boolean result = obj instanceof String; System.out.println(result);
Opsamling: Operatoren instanceof
Vigtigste pointer:
- instanceof kontrollerer typen ved kørsel og forhindrer ClassCastException
- Returnerer false for null — kaster aldrig NPE
- Returnerer true for selve klassen og alle dens underklasser og grænseflader
- Java 16+ mønstermatchning: if (x instanceof String s) kombinerer kontrol og cast
- Java 21 switch med mønstre fordeler efter type på en enkel måde med valgfri vagtbetingelse
- Forseglede klasser og komplet switch gør en default-case unødvendig
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Operatoren instanceof” gratis?
Ja — hele teksten til “Operatoren instanceof” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Operatoren instanceof”?
Brug instanceof til at kontrollere objekttyper før casting og undgå ClassCastException. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Operatoren instanceof”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Primitive typer vs. referencetyper
- Udvidende og indsnævrende konverteringer
- Operatoren instanceof
- Typecasting i praksis