9.4 Sonderfall: überschriebene Attribute

Der Polymorphismus funktioniert in Java nicht im Fall von überschriebenen Attributen die einen unterschiedlichen Typ besitzen.

Bei überschriebenen Attributen wendet Java den Typ der Referenz an um das Attribut zu bestimmen.

Im Beispiel der Klassen Point und CircleIsPoint wird dies mit Hilfe des Attributs layer gezeigt:

Klasse Point

public class Point {
    ...
    public double layer = 5D;
    ...
    public void print() {System.out.println(toString());}
    public String toString() {return ("x: " + x + " y: " + y);}
}

Klasse CircleIsPoint

public class CircleIsPoint extends Point{
    ...
    public int layer = 1;
    ...
    public void print() {
        System.out.println(super.toString() + " radius: " + radius);
    }
}

Hauptprogramm

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();

        Point p2 = pf[2];
        p2.print(); // toString von CircleIsPoint wird benutzt
        double t1 = 1000.0 + p2.layer; // layer von Point wird benutzt
        System.out.println(t1);

        CircleIsPoint cip = (CircleIsPoint)pf[2];
        cip.print(); // toString von CircleIsPoint wird benutzt
        double t2 = 1000.0 + cip.layer; // price von CircleIsPoint wird benutzt
        System.out.println(t2);
    }
}

Hiermit ergeben sich die folgenden Belegungen:

Konsolenausgabe

x: 2.2 y: 3.3
x: 2.22 y: 3.33
x: 4.4 y: 5.5 radius: 6.6
x: 4.4 y: 5.5 radius: 6.6
1005.0
x: 4.4 y: 5.5 radius: 6.6
1001.0

Im ersten Fall (p2) wird das Attribut layer vom Typ double benutzt. Im Fall der Variable cip vom Typ CircleIsPoint wird die Variable layer vom Typ int benutzt.

Es kommt kein Polymorphismus zum Tragen, die Auswahl des Attributs richtet sich nach dem Typ der Referenz!

Tipp: Durch das strikte Anwenden von Datenkapselung greift man nur noch über Zugriffsmethoden auf Attribute zu. Hierdurch wird der Polymorphismus auch beim Zugriff auf Attribute (intuitiv) gewährleistet. Das Ausnutzen des nicht polymorphen Verhalten betrifft dann nur noch Sonderfälle in denen man dies explizit wünscht.

Anonymous (not verified)

Sat, 12/14/2019 - 14:27

Warum wird im Hauptprogramm durch p2.print(); die Methode der Klasse CircleIsPoint aufgerufen und nicht die Methode von Point?

Stefan Schneider

Sun, 12/15/2019 - 10:17

In reply to by Anonymous (not verified)

p2. print() im Hauptprogramm ruft print() von Punkt auf. Hier ist dann die Frage welches Attribut ausgelesen wird. cip.print() ruft die print() Methode aus CircleIsPoint auf. Hier muss mann dann auch überlegen welches Attribut ausgelesen wird.

Anonymous (not verified)

Sat, 12/14/2019 - 14:34

Die Namen und Werte im Diagramm passen nicht zum Code. Daher wird das Beispiel nicht klar.

Stefan Schneider

Sun, 12/15/2019 - 10:12

In reply to by Anonymous (not verified)

Ich habe hier ein Diagramm aus einem anderen Beispiel verwendet. Ich muss überlegen ob ich es lösche oder anpasse.