Typ eines Objektes ermitteln
Das Beispiel weist insgesamt vier Klassen auf. Von
diesen enthält InstanceofClass
die
main-Methode und wird ausgeführt. Die Klasse Person
dient als Superklasse, von der Vater
und
von dieser wiederum Kind
abgeleitet wurden.
In main()
wird zunächst ein Objekt vom
Typ Kind
gebildet und dies in der Variablen
kind
gespeichert. Dann wird eine Variable
vom Typ Person
erzeugt, diese aber mit null
initialisiert.
Darauf folgen einige
Objekt-Überprügungen mit instanceof
und entsprechende Ausgaben.
public class InstanceofClass { public static void main(String[] args) { Kind kind = new Kind(); Person person = null; System.out.println("kind ist vom Typ Kind: " + (kind instanceof Kind)); System.out.println("person ist vom Typ Person: " + (person instanceof Person)); System.out.println("kind ist vom Typ Vater: " + (kind instanceof Vater)); System.out.println("kind ist vom Typ Person: " + (kind instanceof Person)); System.out.println("person ist vom Typ Kind: " + (person instanceof Kind)); } } class Person { } class Vater extends Person { } class Kind extends Vater { String hallo() { return "Hallo Papa!"; } }
Die Ausgabe sieht wie folgt aus:
kind ist vom Typ Kind: true person ist vom Typ Person: false kind ist vom Typ Vater: true kind ist vom Typ Person: true person ist vom Typ Kind: false
Der Operator erwartet zwei Operanden: Links steht das zu
überprüfende Objekt rechts der Bezeichner der
Klasse, auf die hin das Objekt geprüft werden soll.
Das
Ergebnis der ersten Zeile verwundert nicht:
Selbstverständlich ist das Objekt kind
auch vom Typ Kind
, da es aus diesem
gebildet wurde. In der zweiten Zeile wird
überprüft, ob auch das Objekt person
vom Typ Person
ist. Hier wird jedoch false
ausgegeben, da das Objekt mit null
initialisiert wurde, das Objekt selbst also eigentlich
nicht existiert.
Die dritte Zeile erzeugt die Ausgabe
true
, da das Objekt kind
vom
Typ Kind
von Vater abgeleitet wurde und
somit die Eigenschaftsmenge dieser Klasse mit
beinhaltet.
Auch die vierte Zeile erzeugt true
,
da kind
durch die Ableitung von Vater
auch eine Spezifizierung von Person
ist.
Wie die nächste Zeile zeigt ist dies aus zweierlei
Gründen jedoch umgekehrt nicht der Fall:
person
wurde mitnull
initialisiertperson
ist keine Ableitung vonKind
. Zwar ist jedeskind
einePerson
, aber nicht jedeperson
, ist auch einKind
, sondern könnte z.B. auch einVater
sein.
Pattern Matching
Wird ein Objekt eines Subtyps in einer Variablen des Supertyp gespeichert, aber auf den Subtyp zugegriffen, muss nach der Typprüfung vor der Verwendung ggf. ein explizites Casting stattfinden:
Person person = new Kind(); if (person instanceof Kind) { System.out.println(((Kind) person).hallo()); }
Ab Java 16 wird dies vereinfacht. Der instanceof
-Operator
erlaubt nun das sog. Pattern Matching, das ein ggf.
notwendiges explizites Casting überflüssig
macht. Hierbei wird hinter dem Operator instanceof
nicht mehr nur ein Typenbezeichner, sondern eine
Variablendeklaration notiert. Deren Typ wird mit dem zu
prüfenden, vor dem Operator, verglichen.
Person person = new Kind(); if (person instanceof Kind k) { System.out.println(k.hallo()); }
Im vorliegenden Fall wird geprüft, ob der Typ von person
zum Pattern Kind k
passt. Da dies der Fall
ist, wird dann k
mit dem Wert von person
initialisiert und kann direkt weiterverwendet werden.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.