8. Shadowed Variables und Method Overriding

Shadowed Variables:

    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).
 

 vorherige Seite Inhalt nächste Seite