Typ eines Objektes ermitteln

Mit dem Operator instanceof kann der Typ eines Objektes ermittelt werden. Er liefert einen boolschen Wert, abhängig davon, ob das Objekt vom geprüften Typ ist oder nicht.

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:

  1. person wurde mit null initialisiert
  2. person ist keine Ableitung von Kind. Zwar ist jedes kind eine Person, aber nicht jede person, ist auch ein Kind, sondern könnte z.B. auch ein Vater 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.