In diesem Beitrag behandeln wir die Modifier von Java und gehen dabei ausführlich auf deren Eigenschaften ein.
Modifier werden in Java-Anwendungen benutzt um die Sichtbarkeit, Lebensdauer und Veränderbarkeit von Programmelementen festzulegen.
Sie üben somit großen Einfluss auf die Eigenschaften von Variablen, Methoden und Klassen aus.
Im Folgenden werden wir jeden Java-Modifier kurz vorstellen und dabei jeweils auf die relevanten Auswirkungen auf Sichtbarkeit, Lebensdauer und Veränderbarkeit von Programmelementen eingehen.
Die unten aufgeführten Modifier sind in Java implementiert:
Java-Modifier: private
Alle private-Programmelemente besitzen eine verdeckte Sichtbarkeit und sind nur in ihrer eigenen Klasse sichtbar.
Abgeleitete Klassen können nicht auf private-Elemente ihrer Vaterklasse zugreifen.
Auf private-Elemente, wie Variablen und Methoden, kann nicht von außen zugegriffen werden. Für Aufrufer von Instanzen sind private-Elemente nicht sichtbar.
Entwickler sollten immer dann private-Elemente definieren, wenn wichtige Details zu verbergen sind, die in abgeleiteten Klassen und von außen nicht sichtbar sein sollen.
Java-Modifier: protected
Die Elemente (Variablen und Methoden) vom Typ protected sind in der eigenen Klasse und in allen abgeleiteten Klassen sichtbar.
Zudem können protected-Elemente auch von anderen nicht verwandten Klassen innerhalb desselben Pakets gesehen werden.
Für Klassen, die in anderen Paketen definiert wurden, sind protected-Elemente nicht sichtbar.
Java-Modifier: public
Alle Variablen und Methoden vom Typ public sind für die eigene Klasse und alle äußeren Klassen sichtbar. Die public-Elemente können auch von Methoden anderer Klassen verwendet werden, selbst wenn diese Klassen außerhalb des Pakets definiert sind.
In Java muss in jeder Quelldatei genau eine Klasse vom Typ public sein. Nur diese eine öffentliche Klasse ist außerhalb des Pakets sichtbar, in dem sie definiert wurde.
Java-Modifier: standard (package scope)
Java-Elemente, die nicht als public, protected oder private deklariert wurden, erhalten die standard-Sichtbarkeit (auch als package scope bezeichnet). Diese Elemente sind nur innerhalb des Pakets sichtbar, in dem sich die eigene Klasse befindet.
Von außen kann nicht auf standard (package scope)-Elemente zugegriffen werden, sie sind von anderen Paketen aus nicht sichtbar.
Möchte man innerhalb von größeren Paketen Hilfsklassen zugänglich machen, ohne die öffentlich zu machen, bietet sich die standard (package scope) Deklaration an.
Java-Modifier: static
Variablen und Methoden müssen in Java standardmäßig immer über eine Instanz der Klasse aufgerufen werden, in der sie definiert wurden. Möchte man Variablen und Methoden ohne ein konkretes Objekt aufrufen, müssen diese als static deklariert werden.
Mit static deklarierte Programmelemente existieren unabhängig von Objekten, vom Zeitpunkt ab dem die Klasse geladen wurde bis zum Beenden der Java-Anwendung.
Auf static-Elemente wird über die Klasse zugegriffen und nicht über die Instanz der Klasse, dadurch sind diese Elemente statisch und über die gesamte Programmlaufzeit verfügbar.
Java-Modifier: final
Möchte man in Java Konstanten definieren, müssen diese als Variablen vom Typ final deklariert werden. Dadurch ist ein nachträgliches Ändern der Variable nicht mehr möglich und der Initialisierungswert wird über die gesamte Programmlaufzeit gehalten.
Methoden, die als final deklariert sind, können nicht in abgeleiteten Klassen überlagert werden.
Klassen, die als final deklariert wurden, können nicht abgeleitet werden. Bei final-Klassen endet somit der Ableitungszweig.
Hinweis: In Java werden final-Methoden performanter als normale Methoden ausgeführt, da keine dynamische Methodensuche erfolgen muss. Möchte man bestimmte Methoden schneller ausführen lassen, ist es empfehlenswert diese als final zu deklarieren.
Achtung! Der Inhalt eines als final deklarierten Objekts (Instanz) kann auch nach der Initialisierung des Objekts noch verändert werden. Durch die final-Deklaration ist nur das Zuweisen einer neuen Objektreferenz verboten.
Das bedeutet Objektvariablen vom Typ final behalten über die gesamte Laufzeit die anfangs zugewiesene Objektreferenz, wobei sich aber durchaus der Inhalt des referenzierten Objekts verändern kann.
Dies gilt auch für Arrays und Strings, da beide auch als Objekte in Java implementiert sind.
Java-Modifier: transient und volatile
In Java gibt es noch zwei weitere Modifier, beide sind für komplexere Anwendungen vorgesehen und werden daher hier nur kurz erwähnt.
Möchte man, dass bestimmte Variablen beim Serialisieren und Deserialisieren ignoriert werden, müssen diese als transient deklariert werden. Dadurch weiß Java, dass diese Variablen nicht persistent sind.
Werden Variablen verwendet, die außerhalb des aktuellen Threads verändert werden können, müssen diese als volatile deklariert werden. Eine volatile-Variable wird bei jedem Zugriff erneut gelesen, nicht direkt aus einem Register der virtuellen Maschine entnommen.
Der volatile-Modifier wird bspw. bei Multithreading-Anwendungen eingesetzt und stellt dabei die Datenintegrität sicher.
Comments 4
synchronized nicht gefunden
Author
Hallo Walter,
stimmt, den synchronized-Modifier habe ich nicht beschrieben. Auf der Tutorial-Seite von Oracle habe ich eine schöne Einführung in das Thema gefunden:
synchronized keyword
Viele Grüße, Chris
Pingback: Einführung in Java Design Patterns (Software Entwurfsmuster)
Pingback: Klassen in Java: Die Grundlagen der objektorientierten Programmierung