|
In diesem Kapitel wurden an verschiedenen Stellen Beispiele gezeigt, die Attribute wie public oder private verwenden. Mit Hilfe dieser Attribute können die Eigenschaften von Klassen, Methoden und Variablen verändert werden. Sie haben insbesondere Einfluß auf die Lebensdauer, Sichtbarkeit und Veränderbarkeit dieser Programmelemente. Der vorliegende Abschnitt erläutert alle Attribute im Zusammenhang und macht ihre Wirkungsweise auf die verschiedenen Elemente eines Java-Programms deutlich.
Die eingangs erwähnte Tatsache, daß in einer abgeleiteten Klasse alle Eigenschaften der Basisklasse übernommen werden, ist nicht in allen Fällen korrekt. Zwar besitzt eine abgeleitete Klasse immer alle Variablen und Methoden der Basisklasse, sie kann aber unter Umständen nicht darauf zugreifen, wenn deren Sichtbarkeit eingeschränkt wurde.
Die Sichtbarkeit von Variablen und Methoden wird mit Hilfe von Attributen (die auch Modifier genannt werden) geregelt. In Java gibt es drei Sichtbarkeitsebenen für den Zugriff auf Elemente einer Klasse:
Mit Hilfe dieser Sichtbarkeitsebenen kann der Zugriff auf Klassenelemente eingeschränkt werden. private-Elemente sollten immer dann verwendet werden, wenn implementierungsabhängige Details zu verstecken sind, die auch in abgeleiteten Klassen nicht sichtbar sein sollen. protected-Elemente sind vor Zugriffen von außen geschützt, können aber von abgeleiteten Klassen verwendet werden. Die public-Elemente schließlich bilden die für alle sichtbaren Teile einer Klassendefinition und können daher als ihre Schnittstelle angesehen werden. Nachfolgend werden die verschiedenen Sichtbarkeitsattribute noch einmal genau beschrieben. |
![]() |
|
![]() |
Nachfolgend wollen wir die wichtigsten Attribute noch einmal zusammenfassend darstellen und ihre jeweiligen Auswirkungen auf die Sichtbarkeit, Lebensdauer oder Veränderbarkeit von Variablen, Methoden und Klassen beschreiben. Einige der für uns weniger wichtigen Attribute, wie transient oder volatile, wollen wir nicht näher betrachten.
Methoden oder Variablen vom Typ private sind nur in der aktuellen Klasse sichtbar. Sowohl für Aufrufer von Objekten der Klasse als auch für abgeleitete Klassen bleiben sie unsichtbar.
Methoden oder Variablen vom Typ protected sind in der aktuellen Klasse und in abgeleiteten Klassen sichtbar. Darüber hinaus sind sie für Methoden anderer Klassen innerhalb desselben Pakets sichtbar (das ist ein wichtiger Unterschied beispielsweise zu C++). Sie sind jedoch nicht für Aufrufer der Klasse sichtbar, die in anderen Paketen definiert wurden.
Membervariablen und Methoden vom Typ public sind im Rahmen ihrer Lebensdauer überall sichtbar. Sie können daher in der eigenen Klasse und von beliebigen Methoden anderer Klassen verwendet werden. Das Attribut public ist zusätzlich auch bei der Klassendefinition selbst von Bedeutung, denn nur Klassen, die als public deklariert wurden, sind außerhalb des Paktes sichtbar, in dem sie definiert wurden. In jeder Quelldatei darf nur eine Klasse mit dem Attribut public angelegt werden.
Werden Methoden oder Variablen ohne eines der drei Sichtbarkeitsattribute definiert, so entspricht ihr Verhalten im wesentlichen dem von Elementen des Typs protected. Damit sind sie - und das ist ihre wichtigste Eigenschaft - innerhalb desselben Pakets überall sichtbar. Der Unterschied zu protected besteht darin, daß sie in Unterklassen, die in anderen Paketen definiert werden, unsichtbar bleiben.
Variablen und Methoden mit dem Attribut static sind nicht an die Existenz eines konkreten Objekts gebunden, sondern existieren vom Laden der Klasse bis zum Beenden des Programms. Das static-Attribut beeinflußt bei Membervariablen ihre Lebensdauer und erlaubt bei Methoden den Aufruf, ohne daß der Aufrufer ein Objekt der Klasse besitzt, in der die Methode definiert wurde.
Wird das Attribut static nicht verwendet, so sind Variablen innerhalb einer Klasse immer an eine konkrete Instanz gebunden. Ihre Lebensdauer beginnt mit dem Anlegen des Objekts und dem Aufruf eines Konstruktors und endet mit der Freigabe des Objekts durch den Garbage Collector.
Variablen mit dem Attribut final dürfen nicht verändert werden, sind also als Konstanten anzusehen. Methoden des Typs final dürfen nicht überlagert werden; ebensowenig dürfen Klassen des Typs final zur Ableitung neuer Klassen verwendet werden. Wird das Attribut final dagegen nicht verwendet, sind Variablen veränderbar, können Methoden überlagert und Klassen abgeleitet werden.
Falls eine Methode oder Klasse das Attribut final besitzt, kann der Compiler in der Regel auf die dynamische Methodensuche verzichten; final-Methoden können daher schneller aufgerufen werden als normale Methoden. Dies ist einer der Gründe dafür, daß die Java-Designer einige der mitgelieferten Klassen als final deklariert haben. Es führt aber gleichzeitig dazu, daß die entsprechenden Klassen nicht mehr erweitert werden können. Prominentestes Beispiel aus der Laufzeitbibliothek ist sicherlich die als final deklarierte Klasse String. |
![]() |
|
![]() |
|
Go To Java 2, Addison Wesley, Version 1.0.2, © 1999 Guido Krüger, http://www.gkrueger.com |