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:
personwurde mitnullinitialisiertpersonist keine Ableitung vonKind. Zwar ist jedeskindeinePerson, aber nicht jedeperson, ist auch einKind, sondern könnte z.B. auch einVatersein.
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.