4.11.5 | Der instanceof-Operator |
Mit dem instanceof-Operator kann zur Laufzeit geprüft werden, ob ein von einem Verweis referenziertes Objekt zuweisungskompatibel zu einer Klasse ist, die im zweiten Operanden von instanceof angegeben wird. Der zweite Operand darf kein Verweis sein. instanceof hat die Syntax<Verweis oder Verweistyp> instanceof <Verweistyp>instanceof liefert true, wenninstanceof liefert false, wenn
- der linke Operand eine Variable mit einem Verweistyp ist und zur Laufzeit auf ein Exemplar verweist, das zu der Klasse (oder einer Unterklasse) gehört, die der zweite Operand vorgibt.
Mit instanceof kann zum Beispiel zunächst festgestellt werden, ob zwei Objekte zuweisungskompatibel sind, bevor die eigentliche Zuweisung erfolgt.
- der linke Operand den Wert null hat, da dieser Wert anzeigt, dass auf kein Objekt verwiesen wird;
- der linke Operand eine Variable mit einem Verweistyp ist und zur Laufzeit auf ein Exemplar verweist, das nicht zu der Klasse (oder einer Unterklasse) gehört, die der zweite Operand vorgibt.
Das folgende Beispiel zeigt den Anwendungsfall einer Zuweisung:Point p; // Zuweisung an p; if (p instanceof Square) Square s = (Square)p;Durch die if-Anweisung wird p nur dann an r zugewiesen, wenn der Wert von p zur Laufzeit ein Exemplar von Square ist. Falls p auf ein Exemplar einer beliebigen Unterklasse von Square verweist, ist das Ergebnis von instanceof natürlich auch true.
In der Standardbibliothek wird instanceof fast durchgänig in den Implementierungen der equals(Object)-Methode eingesetzt, um vor dem Vergleich der Datenelemente zu prüfen, ob das übergebene Objekt überhaupt zur gleichen Klasse gehört. Hat diese Prüfung Erfolg, kann das zu prüfende Objekt gefahrlos mit einem Cast umgewandelt und die Datenelemente verglichen werden. Der folgende Auszug stammt aus der Methode equals() von java.awt.Point:public boolean equals(Object obj) { if (obj instanceof Point) { Point pt = (Point)obj; return (x == pt.x) && (y == pt.y); } ... }
Ein weiterer häufiger Anwendungsfall ist die Prüfung, ob ein Flag-Interface implementiert ist.