Vom folgenden Java-Programm sollten 2 Versionen betrachtet werden:
class ober { // private void x() { System.out.println("ober x"); } void y() { x(); } } class unter extends ober { void x() { System.out.println("unter x"); } } public class privatetest { public static void main(String argv[]) { ober obj = new unter(); obj.y(); } }Es sollten die Ausgaben beider Versionen betrachtet werden und eventuell auftretende Unterschiede erklärt werden.
Ausgabe:
unter x
ober x
Erklärung: Eine Instanzmethode überschreibt alle Methoden aus Oberklassen und Oberklassen-Interfaces, die die gleiche Signatur haben und ansonsten zugreifbar wären (vgl. Folie 108). Methoden, die private deklariert sind, sind ausschließlich in der Klasse ihrer Deklaration sichtbar (vgl. Folie 94), also nicht in erbenden Klassen. Sie können somit nicht überschrieben werden.
Im ersten Fall wurde die Methode x() aus der Klasse ober also durch die Neudefinition in der Klasse unter überschrieben, während dies im zweiten Fall nicht geschieht, so daß ober.x() aufgerufen wird.
Hier ein kleines Beispiel, daß diesen Fall erläutert:
class ober { void x() //Default-Sichtbarkeit: packet { System.out.println("ober x"); } ober() { x(); //Methodenaufruf im Konstruktor! } } class unter extends ober { int attr = 42; void x() //verdeckt die ansonsten sichtbare Methode ober.x() { System.out.println("unter x: attr = " + attr); } } public class ukonstr { public static void main(String argv[]) { ober obj = new unter(); } }
Ausgabe:
unter x: attr = 0
Erklärung: Bei der Erzeugung eines Objektes vom Typ "unter" wird, da keine eigener Konstruktor vorhanden ist, der vom Compiler erzeugte Default-Konstruktor aufgerufen. Dieser wiederum ruft super() auf, also hier ober(). ober() ruft nun die Methode x() auf, die in der Klasse "unter" überschrieben wurde.
Durch die dynamische Bindung wird zur Laufzeit aus dem Konsturktor ober() heraus die Methode unter.x() aufgerufen, die das Attribut "attr" der Klasse "unter" ausgibt, dessen Initialisierung "attr=42" zu diesem Zeitpunkt noch nicht durchgeführt ist, so daß "0" (vgl. Folie 65) ausgegeben wird.
Der so mögliche Zugriff auf noch nicht initialisierte Attribute kann kann zu Laufzeitfehlern führen.
Es sollte die API-Dokumentiation von Sun verwendet werden, um herauszufinden, wer diese Methoden aufruft und warum.
Ergebnis der Recherchen:
Ein Applet ist ein kleines Programm, welches nicht dazu gedacht ist eigenständig zu laufen, sondern eingebettet innerhalb anderer Applikationen. Die Klasse Applet muß die Oberklasse jedes Applets sein, daß in eine Web-Seite eingebettet oder vom Applet Viewer angezeigt werden soll. Die Applet Klasse stellt ein Standard-Interface zwischen den Applets und ihrer Umgebung bereit.
Jedes Applet erbt also von der Klasse java.applet.Applet, die sich folgendermaßen in die Klassenhierachie einordnet:
Class java.applet.Applet java.lang.Object | +----java.awt.Component | +----java.awt.Container | +----java.awt.Panel | +----java.applet.AppletDie Methoden start() und stop() sind in java.applet.Applet implementiert und werden vom Browser aufgerufen:
Eine Komponente ist ein Objekt mit einer graphischen Darstellung, die auf dem Bildschirm dargestellt werden kann und auch mit dem Anwender interagieren kann. Beispiele fuer Komponenten sind Buttons, Checkboxen und Scrollbars, wie man sie bei einem typischen graphischen User Interface findet.