public class GraphicCircle extends Circle {
Color outline, fill;
float r;
public GraphicCircle(double
x, double y, double rad, Color o, Color f) {
super(x, y, rad); outline = o; fill = f;
}
public void SetResolution(float
resolution) { r = resolution; }
public void draw(DrawWindow
dw) { dw.drawCircle(x, y, r, outline, fill); }
}
Die Variable r der Klasse GraphicCircle überschattet
die Variable r der Klasse Circle.
Auf die Variable r der Klasse Circle kann mit "super.r"
oder mittels Casting " ((Circle) this).r " zugegriffen werden.
Method Overriding:
Eine Funktion einer Unterklasse, die den gleichen Namen
und die gleichen Argumente wie eine Funktion aus der Oberklasse hat, ersetzt
diese.
Der Unterschied zum Shadowing ist, daß es beim
Method Overriding das sogenannte "Dynamic Method Lookup" gibt. Dies wird
am besten durch ein Beispiel erklärt: Angenommen, es gibt eine Unterklasse
Ellipse mit einer area()-Fkt. für die Fläche der Ellipse. Weiterhin
hat die Klasse Ellipse eine Oberklasse namens Circle mit einer area()-Fkt
für die Fläche des Kreises. Nun wird ein Objekt der Klasse Ellipse
wird zu einem Objekt des Typs Circle gecastet, und anschließend wird
auf dieses Objekt die area()-Fkt. angewendet. Dann wird durch diesen area()-Aufruf
immer noch die area()-Fkt. der Ellipse-Klasse ausgeführt und NICHT
die der Circle-Klasse.
Das bedeutet, es wird immer automatisch die passende
Methode ausgesucht.
Auf die überschriebene Methode aus der Oberklasse
kann mit super.<Methode> zugegriffen werden. Dies allerdings nur in
der Klasse möglich, die die Funktion <Methode> überschreibt.
Dabei muß aber die überschriebene Methode nicht aus der direkten
Oberklasse sein, sondern kann auch z.B. aus der Oberklasse der Oberklasse
sein, da durch Vererbung die Methode in allen Unterklassen existiert.
Mit "final" deklarierte Methoden können nicht überschrieben
werden (ebensowenig class methods und Methoden einer final class).