Wednesday, January 18, 2006

Attributüberdeckung in Java

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