9.5 instanceof-Operator

Normalerweise sind zur Laufzeit eines Programmes bereits alle Typen bekannt und wurden vom Übersetzer schon beim Übersetzen des Programms kontrolliert.

Durch die Möglichkeit der Typkonvertierung durch "casten", und "Upcasting" kann man die genaue Information über einen Typ einer Instanz zur Laufzeit verlieren. Das bedeutet, sie ist im Kontext einer Methode oder Klasse nicht mehr bekannt.

Zur Bestimmung eines Typs zur Laufzeit bietet Java den instanceof Operator an mit dem man Instanzen auf Ihren Typ prüfen kann.

Im vorhergehenden Beispiel mit den Klassen Point und CircleIsPoint kann man den instanceof Operator verwenden um einen Laufzeitfehler bei einer cast-Operation zu vermeiden:

public class Main {

    public static void main(String[] args) {
        Point[] pf = new Point[3];
        pf[0] = new Point (2.2, 3.3);
        pf[1]  = new Point (2.22, 3.33);
        pf[2] = new CircleIsPoint(4.4,5.5,6.6);

        pf[0].print();
        pf[1].print();
        pf[2].print();

        double r2 = 0;
        CircleIsPoint cip1;
        if (pf[2] instanceof CircleIsPoint) {
            cip1 = (CircleIsPoint)pf[2];
            r2 = cip1.getRadius();
            }
    }
}

Weiterführend: getClass() Methode

Die Javalaufzeitumgebung verfügt über ein vollständiges, dynamisches System zur Verwaltung von Metainformationen inklusive der Informationen über eine Klasse.

Hierzu dient die Klasse Class die man über die Methode Object.getClass() benutzen kann. Die Methode getClass() wird an alle Klassen vererbt. Hiermit kann man Informationen über die Klasse selbst, wie zum Beispiel ihren Name und die Oberklasse auslesen:

public class Main {

    public static void main(String[] args) {
        Point[] pf = new Point[3];
        pf[0] = new Point (2.2, 3.3);
        pf[1]  = new Point (2.22, 3.33);
        pf[2] = new CircleIsPoint(4.4,5.5,6.6);

        pf[0].print();
        pf[1].print();
        pf[2].print();

        double r2 = 0;
        CircleIsPoint cip1;
        Class myClass = pf[2].getClass();
        Class mySuperClass = myClass.getSuperclass();
        System.out.println("pf[2] Klassenname: " + myClass.getSimpleName());
        System.out.println("pf[2] Oberklasse: "  + mySuperClass.getSimpleName());
        if (pf[2] instanceof CircleIsPoint) {
            cip1 = (CircleIsPoint)pf[2];
            r2 = cip1.getRadius();
            }
    }
}

Die Konsolenausgabe des Programmes ist die Folgende:

x: 2.2 y: 3.3
x: 2.22 y: 3.33
x: 4.4 y: 5.5 radius: 6.6
pf[2] Klassenname: CircleIsPoint
pf[2] Oberklasse: Point