Java instanceof: So funktioniert der Operator
Mit dem Java-Operator instanceof überprüfen Sie die Übereinstimmung zwischen einem Objekt und einer Klasse. Der Operator liefert diese Information in Form einer boolschen Aussage, also „true“ oder „false“. Durch die Überprüfung können Sie Fehlermeldungen vermeiden.
Was ist instanceof in Java?
Nicht alle Variablen in Java sind so spezifisch, dass ihre Beschaffenheit sofort ersichtlich ist. Gerade wenn in der Programmiersprache ein umfangreiches Projekt mit zahlreichen Variablen erstellt wird, können zum Beispiel Input-Daten dafür sorgen, dass eine Variable am Ende als eines von mehreren Objekten erscheint. Aus diesem Grund stellt Java den instanceof-Operator zur Verfügung. Dieser stellt sicher, dass die Instanz (engl. „instance“) einer Referenzvariablen auch tatsächlich mit einer Klasse, Unterklasse oder Schnittstelle übereinstimmt. Ist dies der Fall, gibt der Operator den boolschen Wert „true“ (wahr) aus. Gibt es keine Übereinstimmung, lautet die Ausgabe „false“ (unwahr).
Insbesondere bevor ein unbekanntes Objekt umgewandelt wird, sollte unbedingt Java instanceof durchgeführt werden, um sicherzugehen, dass das Objekt zur angenommenen Klasse gehört. Ohne diesen Sicherheitscheck kann es ansonsten vorkommen, dass eine ClassCastException ausgegeben wird. Diese entsteht, wenn ein Objekt in eine andere Klasse umgewandelt werden soll. Die Fehlermeldung kann gerade in einem längeren Code für Verwirrung und Probleme sorgen, weshalb eine frühzeitige Absicherung ratsam ist.
- Flexibel: Hosting, das jedem Website-Traffic standhält
- Verlässlich: Inklusive 24/7-Support und persönlicher Beratung
- Sicher: Kostenloses SSL-Zertifikat, DDoS-Schutz und Backups
Funktionsweise und Syntax
Wenn Sie instanceof in Java durchführen, vergleicht der Operator eine Referenzvariable mit einer bestimmten Klasse, die Sie ebenfalls angeben. Er trifft keine weiteren Aussagen über die Beschaffenheit des Objekts oder der Klasse, sondern bestimmt lediglich, ob eine Übereinstimmung besteht oder nicht. Auch die Syntax ist dementsprechend sehr einfach. Sie sieht folgendermaßen aus:
(objekt) instanceof (klasse)
javaIst (objekt)
eine Instanz von (klasse)
wird „true“ ausgespielt. Ist dies nicht der Fall, erscheint „false“.
Einfaches Beispiel für einen instanceof-Operator in Java
Am einfachsten lässt sich Java instanceof und seine Funktionsweise mit einem kurzen Beispiel veranschaulichen. Dafür erstellen wir zunächst eine Klasse namens „Tier“.
public class Tier {
}
javaIm nächsten Schritt erweitern (engl. „extend“) wir diese Klasse um eine Unterklasse namens „Katze“.
public class Katze extends Tier {
}
javaNun können wir Java instanceof nutzen, um zu überprüfen, ob eine Instanz von „Katze“ zur Klasse „Tier“ gehört. Dafür nutzen wir die folgenden Zeilen und geben Sie mit dem Java-Befehl System.out.println
aus:
public class Tier {}
public class Katze extends Tier {
public static void main(String args []{
Katze Katze = new Katze();
System.out.println(Katze instanceof Tier);
}
}
javaDie Ausgabe sollte so aussehen:
true
javaMehrere Ebenen und die Object-Klasse
Das Prinzip funktioniert auch mit der Main-Klasse und weiteren Unterklassen. Zur Veranschaulichung wählen wir ein weiteres Beispiel mit mehreren Ebenen und erweitern den Operator instanceof in Java um die Anweisung if-else
. Bei den Texten hinter den zwei Querstrichen handelt es sich um Java Comments, die lediglich die einzelnen Schritte erläutern, für die Ausgabe aber keine Rolle spielen.
// Klasse 1
// Oberklasse
public class Tier {
}
// Klasse 2
// Unterklasse
class Katze extends Tier {
}
// Klasse 3
// Main-Klasse
class Main {
public static void main(String[] args)
Katze Katze1 = new Katze();
if (Katze1 instanceof Katze)
System.out.println ("Katze1 ist eine Instanz von Katze");
else
System.out.println ("Katze1 ist KEINE Instanz von Katze");
if (Katze1 instanceof Tier)
System.out.println ("Katze1 ist eine Instanz von Tier");
else
System.out.println ("Katze1 ist KEINE Instanz von Tier");
if (Katze1 instanceof Object)
System.out.println ("Katze1 ist eine Instanz von Object");
else
System.out.println ("Katze1 ist KEINE Instanz von Object);
}
}
javaDa in unserem Beispiel „Katze1“ eine Instanz der Klasse „Katze“ und der Oberklasse „Tier“ ist, werden beide Abfragen mit „true“ beantwortet. Da Object bzw. die Klasse „java.lang.Object“ in der Hierarchie ganz oben steht, ist „Katze1“ außerdem eine Instanz von Object. Der Java instanceof Operator wird somit immer „true“ ausgeben, wenn er mit der Object-Klasse angewendet wird. Die entsprechende Ausgabe sieht daher so aus:
Katze1 ist eine Instanz von Katze
Katze1 ist eine Instanz von Tier
Katze1 ist eine Instanz von Object
javaAusgabe bei einem Null-Wert
Wenn eine Variable den Wert 0 hat, also kein Objekt enthält, gibt der Java Operator instanceof automatisch „false“ aus. Dies können Sie mit dem folgenden Beispiel überprüfen:
class Katze {
}
class Main {
public static void main(String[] args)
{
Katze Katze2 = null;
if (Katze2 instanceof Katze)
System.out.println ("Katze1 ist eine Instanz von Katze");
else
System.out.println ("Katze1 ist KEINE Instanz von Katze");
}
}
javaDie passende Ausgabe lautet in diesem Fall:
Katze1 ist KEINE Instanz von Katze
javaOberklassen sind keine Instanz einer unteren Klasse
Während in der Hierarchie Objekte in Unterklassen auch zu den übergeordneten Klassen gehören, funktioniert dieses Prinzip andersherum nicht. In unserem folgenden Beispiel können wir dies veranschaulichen:
class Tier {
}
class Katze extends Tier {
}
class Main {
public static void main(String[] args)
{
Tier Bello = new Tier ();
if (Bello instanceof Katze)
System.out.println ("Bello ist eine Instanz von Katze");
else
System.out.println ("Bello ist KEINE Instanz von Katze");
}
}
javaDie Ausgabe lautet in diesem Fall:
Bello ist KEINE Instanz von Katze
javaFehlermeldung bei fehlender Verbindung
Wenn es keine Verbindung zwischen dem Objekt und der Klasse, mit der es verglichen werden soll, gibt, wird eine Fehlermeldung ausgegeben. Auch das zeigen wir an einem Beispiel und erstellen eine neue Klasse namens „Hund“, die zwar zur Oberklasse „Tier“ gehört, allerdings in keiner Verbindung zu „Katze“ steht.
class Hund implements Tier {
}
class Main {
public static void main(String[] args)
{
Katze Katze3 = new Katze ();
System.out.println (Katze3 instanceof Hund);
}
}
javaIn diesem Fall erhalten wir eine Fehlermeldung, die uns darauf hinweist, dass zwischen den Klassen „Katze“ und „Hund“ keinerlei Verbindung besteht. Diese Meldung sieht so aus:
java.lang.Error: Unresolved compilation problem:
Incompatible conditional operand types Katze and Hund
javaIn unserem Digital Guide finden Sie weitere spannende Tutorials und informative Artikel zu Java. Wir vergleichen zum Beispiel Java und JavaScript und stellen Java und Python gegenüber. Wenn Sie mehr über Java Bitwise Operators erfahren möchten, haben wir ebenfalls den passenden Leitfaden.