Literatur

Modifikatoren

Java bietet für viele Bereiche Modifikatoren. Mit diesen können Klassen, Attribute und/oder Methoden für verschiedene Zwecke gekennzeichnet werden.

Es gibt folgende Modifikatoren: public, private, protected, static, final, abstract, transient, volatile, synchronized und native.  Die bekanntesten Modifikatoren darunter dürften die Zugriffsmodifikatoren public, private und protected sein, über die man die Sichtbarkeit der Klasse, des Attributs oder der Methode steuert.

Der folgenden Übersicht können Sie entnehmen, für welche Bereiche die einzelnen Modifikatoren verwendet werden:

  Attribut Methode Konstruktor Klasse Interface
abstract   x   x x
final x x   x  
native   x      
private x x x    
protected x x x    
public x x x x x
static x x      
synchronized   x      
transient x        
volatile x        

 

abstract

Der Modifikator abstract kann bei einer Methode, Klasse oder einem Interface verwendet werden. Dies bedeutet, dass das mit abstract gekennzeichnete Element noch nicht vollständig implementiert worden ist. Ist eine Methode oder ein Interface mit dem Mofikator abstract versehen, so muss die implementierende Klasse ebenfalls als abstract deklariert werden. Wenn eine Klasse mit abstract gekennzeichnet wird, so kann von dieser kein Objekt erzeugt werden.

Eine von einer abstrakten Klasse abgeleitete Subklasse muss alle abstrakten Methoden der Elternklasse vollständig implementieren, anderenfalls muss sie ebenfalls als abstract deklariert werden. Im Gegensatz zu einem Interface kann eine abstrakte Klasse auch implementierte Methoden und Attribute (die nicht als static oder final deklariert sind), beinhalten. Findet bei einer abstrakten Klasse also keinerlei Implementation statt, ist es sinnvoller diese als Interface zu deklarieren.

Beispiel:

public abstract class Punkt           
{
 
    int x_koordinate;   
    int y_koordinate;  
 
    abstract void zeichne();
}

Die Klasse Punkt enthält die abstrakte Methode zeichne. Diese Methode ist mit abstract gekennzeichnet und besitzt daher keinen Methodenrumpf. Der Methodenkopf wird direkt durch ein Semikolon beendet. Dadurch, dass die Methode zeichne abstrakt ist, muss die Klasse Punkt ebenso abstrakt sein.

 

final

Der Modifikator final kann bei Attributen, Methoden und Klassen eingesetzt werden. Attribute mit final sind Konstanten und können nicht mehr verändert werden. Methoden, die mit dem Modifikator final versehen sind, können bei einer Vererbung nicht überschrieben werden. Eine Klasse hingegen steht am Ende einer Vererbungshierarchie, wenn Sie mit final deklariert wurde. Es können keine weiteren Subklassen von ihr abgeleitet werden.

Beispiel:

// Konstante PI nicht mehr veränderbar
final double PI = 3.14;

Das obige Beispiel zeigt die Verwendung von final. In diesem Fall handelt es sich um eine Konstante, die nicht mehr verändert werden kann.

 

native

Einzig Methoden können mit dem Modifikator native gekennzeichnet werden. Diese Methoden sind in einer anderen Programmiersprache geschrieben und dienen der "multilingualen" Kommunikation. Da native eher im professionelleren Bereich zum Einsatz kommt, verzichten wir an dieser Stelle auf ein Beispiel.

 

private

Der Zugriffsmodifikator private kann bei Attributen, Methoden und Konstruktoren angewendet werden. Diese können dann nicht von einer anderen Klasse (auch nicht von abgeleiteten Klassen) gesehen und verwendet werden. Zur besseren Datenkapselung sollten Attribute, so weit möglich, mit diesem Modifikator versehen werden.

Beispiel:

public abstract class Punkt        
{
    /* Attribute wurden mit private deklariert, von außen ist also kein direkter Zugriff auf diese möglich */
    private int x_koordinate;   
    private int y_koordinate;  
 
    // Gibt die x-Position unseres Punktes zurück
    public int getX_koordinate()
    {
        return x_koordinate;
    }
 
    /* Andere Klassen können die X-Koordinate nur über die set-Methode verändern, da das Attribut x_koordinate private ist und daher keinen direkten Zugriff von außen erlaubt. Die Methode setX_koordinate hingegen ist public, so dass auf diese ein Zugriff von außen möglich ist und so die Koordinate innerhalb der Methode geändert werden kann. Der neue Wert der Koordinate wird als Parameter übergeben. Das Attribut selber bleibt auf diese Weise nach außen hin verborgen. */
    public void setX_koordinate(int x_koordinate)
    {
        this.x_koordinate = x_koordinate;
    }
 
    // Gibt die y-Position unseres Punktes zurück
    public int getY_koordinate()
    {
        return y_koordinate;
    }
 
    /* siehe setX_koordinate */
    public void setY_koordinate(int y_koordinate)
    {
        this.y_koordinate = y_koordinate;
    }
}

 

protected

Der Zugriffsmodifikator protected kann genauso wie private eingesetzt werden, allerdings beschränkt sich hier die Sichtbarkeit auf das Paket und nicht wie bei private nur auf die eigene Klasse. Subklassen könnten die mit protected deklarierten Elemente ebenfalls immer "sehen". Würde man in dem obigen Beispiel also private durch protected ersetzen, dann wären die Attribute und Methoden innerhalb des Paketes, in dem die Klasse Punkt sich befindet, verwendbar und alle von Punkt abgeleiteten Subklassen könnten direkt darauf zugreifen.

 

public

Der Zugriffsmodifikator public ist bei allen Konstrukten erlaubt.  Die damit deklarierten Elemente können von jeder Klasse verwendet werden, sie sind also öffentlich. Über öffentliche Methoden können auch Attribute der eigenen Klasse, die mit private gekennzeichnet sind, ausgelesen und verändert werden (siehe Beispiel von private).

 

static

Mit dem Modifikator static werden Klassenvariablen bzw. Klassenmethoden gekennzeichnet.

Klassenmethoden sind unabhängig von Objekten. Der Aufruf der statischen Methode erfolgt daher über den Klassennamen und nicht über den Objektnamen bzw. this-Zeiger.

Klassenvariablen besitzen im Gegensatz zu Attributen für jedes Objekt der Klasse denselben Wert. Die Instanzen der Klasse teilen sich gewissermaßen die Variable. Wird die Klassenvariable in einem Objekt verändert, so haben alle anderen Objekte ebenso die Änderung erhalten.

Beispiel:

public abstract class Punkt           
{
    private int x_koordinate;  
    private int y_koordinate;   
    static int punkteZähler;      // Anzahl aller Objekte der Klasse Punkt
}

In dem obigen Beispiel haben wir die Klassenvariable punkteZähler eingebaut. Die Modifikation der Variablen punkteZähler wirkt sich auf alle Objekte aus. Wird sie z.B. im Konstruktor der Klasse um eins erhöht, so wird sie für jedes Punkt-Objekt um eins erhöht, d.h. der Wert ist für alle Objekte gleich.

 

synchronized

Mit dem Modifikator synchronized werden nur Methoden gekennzeichnet. Dies sichert bei der Verwendung von Threads die Datenkonsistenz, falls ein Thread lesend und ein anderer Thread schreibend auf Daten zugreifen möchte. Threads werden aber noch in einem späteren Kapitel genauer erklärt.

Beispiel:

/* Threads (Prozesse) können nur nacheinander auf diese Methode zugreifen und nicht gleichzeitig.  */
public synchronized void  setY_koordinate(int y_koordinate)
{
        this.y_koordinate = y_koordinate;
}

 

transient

Attribute, die mit dem Modifikator transient gekennzeichnet sind, werden nicht bei einer Serialisierung berücksichtigt, das bedeutet zum Beispiel, dass diese Attribute nicht mit in eine Datei geschrieben würden.

/* Diese Variable würde nicht in eine Datei gespeichert werden */
private transient int y_koordinate;

 

volatile

Attribute, die mit dem Modifikator volatile gekennzeichnet sind, erlauben den gleichzeitigen Zugriff von zwei oder mehr Threads.

/* Auf diese Variable können mehrere Threads (Prozesse) gleichzeitig zugreifen. */
private volatile int y_koordinate;