Mal lernt einiges über eine Programmiersprache, wenn man diese als Tutor anderen Studenten beibringen will.
Folgender Code in Java funktioniert und gibt die Zeichenfolge "4454â³ auf der Konsole aus.
class A { public int attribut; public A() { attribut = 5; } public void test() { System.out.print(attribut); } } class B extends A { // überdeckt attribut von Klasse A public int attribut; public B() { attribut = 4; } // überschreibt Methode public void test() { System.out.print(attribut); } } public class Test { public static void main( String[] args ) { B b = new B(); System.out.print(b.attribut); // gibt "4" aus b.test(); // gibt "Attribut: 4" aus A a = (A) b; System.out.print(a.attribut); // gibt "5" aus ! a.test(); // gibt "Attribut: 4" aus ! } }
Dieses Verhalten erscheint auf dem ersten Blick ganz und gar nicht logisch. Eigentlich hätte man die Ausgabe "4444Ⳡerwartet, da es sich immer um das gleiche Objekt vom Typ B handelt.
Aber:
Java bindet die Methoden dynamisch. Deswegen wird bei a.test() auch die Methodenà der Klasse beaufgerufen. Soweit ist dies allgemein bekannt.
Neu war mir, dass Unterklassen neue Attribute mit dem Namen eines Attributes der Oberklasse definieren können. Dann wird das Attribut der ÃÂberklasse "überdeckt".
Dabei werden Attribute nicht dynamisch sondern statisch gebunden. Deshalb wird bei a.attribut der Attributwert 5. Dies ist der Wert, den die Eigenschaft attribut der Klasse A hat.
Schon sehr seltsam, dieses Verhalten.
No comments:
Post a Comment