Die Modellierung eines Ausschnittes der realen Welt geschieht durch eine Klassenhierarchie, d.h., gleichartige Objekte werden zu Klassen zusammengefasst, von denen durch Vererbung Spezialisierungen abgeleitet werden. Gleichartigkeit bedeutet die Übereinstimmung von objektbezogenen Datenfeldern und objektbezogenen Methoden. Die abgeleitete Klasse erbt von der Superklasse die dort definierten Datenfelder und Methoden, fügt ggf. eigene hinzu und kann ihnen ggf. durch Überschreiben eine neue Bedeutung geben. Jede Klasse besitzt einen oder mehrere Konstruktoren, die für das Instanziieren ihrer Objekte zuständig sind.
Datenfelder, die mit dem Schlüsselwort static deklariert werden, heißen Klassenvariable. Sie existieren pro Klasse genau einmal (unabhängig von der Zahl der kreierten Instanzen) und übernehmen die Rolle von globalen Variablen, auf die alle Objekte dieser Klasse zugreifen können.
Die Sichtbarkeit von Variablen und Methoden wird mit Hilfe von Modifiern geregelt. Ist ein Element einer Klasse mit keinem der Schlüsselworte public, private oder protected deklariert, dann ist es nur innerhalb von Klassen desselben Pakets sichtbar. Das Standardpaket besteht aus allen Klassen im aktuellen Arbeitsverzeichnis.
Die folgende Tabelle zeigt die Umstände, unter denen Klassenelemente der vier Sichtbarkeitstypen für verschiedene Klassen erreichbar sind.
Erreichbar für: | public | protected | paketsichtbar | private |
Dieselbe Klasse | ja | ja | ja | ja |
Subklasse im selben Paket | ja | ja | ja | nein |
Subklasse in anderem Paket | ja | ja | nein | nein |
Keine Subklasse, selbes Paket | ja | ja | ja | nein |
Keine Subklasse, anderes Paket | ja | nein | nein | nein |
Source: Datum.java JavaDoc: Datum.html Applet: Source: Person.java JavaDoc: Person.html Applet: Source: Student.java JavaDoc: Student.html Applet: Source: PersonTest.java JavaDoc: PersonTest.html Applet:
Statisches Binden bezeichnet den Vorgang, einem Objekt zur Übersetzungszeit den Programmcode seiner Methoden zuzuordnen; dynamisches Binden bezeichnet den Vorgang, einem Objekt zur Laufzeit den Programmcode seiner Methoden zuzuordnen.
Folgende Fälle können auftreten:
Person p = new Person ("Uwe","Meier",24,12,1971);} Student s = new Student("Eva","Kahn",15,9,1972,"BWL",1998);}Wird übersetzt und zwei Instanzen werden angelegt.
IO.println(p.fach);
Führt zu einem Übersetzungsfehler, da Instanzen vom Typ Person
nicht über das Datenfeld fach verfügen.
IO.println(((Student)p.fach);
Wird übersetzt, dda eine Instanz vom Typ Student über das
Datenfeld fach verfügt. Führt aber zu einem Laufzeitfehler,
da p zur Laufzeit nicht auf einen Studenten zeigt.
p = s;
Wird übersetzt und ausgeführt. p zeigt nun auf einen Studenten.
IO.println((Student)p.fach);
Wird übersetzt und ausgeführt, da p nun auf eine Instanz vom Typ
Student zeigt, welche über das Datenfeld fach verfügt.
IO.println(p.jahrgang());
Wird übersetzt und ausgeführt. Es kommt die Methode jahrgang()
aus der Klasse Student zum Einsatz. Hinweis: Beim Statischen Binden
wäre bereits zur Übersetzungszeit dem Objekt p die Methode jahrgang der Klasse
Person zugeordnet worden.
Auf der folgenden Seite verdeutlicht eine Grafik das Zusammenspiel zwischen den Klassen Person und Student und ihrer Instanzen. Auf dem Laufzeitkeller führt von der Variable s ein Verweis auf die Speicherfläche, welche eine Instanz vom Typ Student aufnimmt. Da einige Bestandteile von Student (nämlich vorname, nachname, geb_datum und fach) selbst wieder Objekte sind, führen dorthin weitere Verweise, die Instanzvariablen matr_nr und jsb werden hingegen explizit gespeichert. Ein weiterer Verweis (gezeichnet von links nach rechts) führt zu den Klassenvariablen und Klassenmethoden; von dort sind die Oberklassen erreichbar, von denen geerbt wurde.
Source: Kind.java JavaDoc: Kind.html Applet: