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.
- Printer-friendly version
- Log in to post comments
- 5896 views
Frage
Warum wird im Hauptprogramm durch p2.print(); die Methode der Klasse CircleIsPoint aufgerufen und nicht die Methode von Point?
Aufruffabfolge
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.
Namen
Die Namen und Werte im Diagramm passen nicht zum Code. Daher wird das Beispiel nicht klar.
Richtig :-(
Ich habe hier ein Diagramm aus einem anderen Beispiel verwendet. Ich muss überlegen ob ich es lösche oder anpasse.