Spielerei mit Javas dynamischer Bindung und überschatteten Attributen
0 Kommentar(e). Veröffentlicht von Christian Ullenboom am Donnerstag, Mai 28, 2009.Werfen wir ein Blick auf folgendes Java-Programm:
class SuperBoaster
{
int nr = 1;
void boast()
{
System.out.println( "Ich bin die Nummber " + nr );
}
}
public class SubBoaster extends SuperBoaster
{
int nr = 2;
@Override void boast()
{
super.boast(); // Ich bin die Nummber 1
System.out.println( super.nr ); // 1
System.out.println( nr ); // 2
}
public static void main( String[] args )
{
new SubBoaster().boast();
}
}
Die Methode boast() aus SubBoaster ruft mit super.boast() die Methode der Oberklasse auf. Ein einfacher Aufruf von boast() in der Unterklasse würde in eine Rekursion führen. Die Unterklasse hat mit super.nr Zugriff auf die überschattete Objektvariable nr aus der Oberklasse. Es ist super wie this eine spezielle Referenz und kann auch genauso eingesetzt werden, nur das super in den Namensraum der Oberklasse geht.
Eine Aneinanderreihung von super-Schlüsselwörtern bei einer tieferen Vererbungshierarchie ist nicht möglich. Hinter einem super muss eine Objekteigenschaft stehen und Anweisungen wie super.super.nr sind somit immer ungültig.
Für Variablen gibt es eine Möglichkeit, die sich durch einen Cast in die Oberklasse ergibt. Setzen wir in boast() der Unterklasse folgende Anweisung
System.out.println( ((SuperBoaster) this).nr ); // 1
Die Ausgabe 1 ist also identisch mit System.out.println( super.nr ).
Die this-Referenz entspricht einem Objekt vom Typ SubBoaster. Wenn wir dies aber in den Typ SuperBoaster konvertieren, bekommen wir genau das nr aus der Basisklasse unserer Hierarchie. Wir erkennen hier eine sehr wichtige Eigenschaft von Java, nämlich, dass Variablen nicht dynamisch gebunden werden. Anders wäre es, wenn wir folgendes in die Methode boast()der Unterklasse SubBoaster setzen:
((SuperBoaster)this).boast();
Hier ruft die Laufzeitumgebung nicht boast() aus SuperBoaster auf, sondern die aktuelle Funktion boast(), aus SubBoaster sodass wir in einer Rekursion landen. Der Grund dafür liegt in der dynamischen Bindung zur Laufzeit, die ein Compiler-Typecast nicht ändert.
Labels: Insel

0 Antwort(en) auf ›Spielerei mit Javas dynamischer Bindung und überschatteten Attributen‹
Kommentar veröffentlichen