Zugriffsmodifikatoren

Modul #J2

Ziele

  • Ich kann ohne Hilfsmittel alle Zugriffsmodifikatoren beschreiben.
  • Ich kann die Auswirkungen von allen Zugriffsmodifikatoren auf Klassen-, Felder- und Methoden-Ebene beschreiben.
  • Ich kann erklären, warum Felder (Instanzvariablen) immer mit dem Schlüsselwort private deklariert werden sollten.

Zugriffsmodifikatoren

In Java können wir Klassen, Feldern und Methoden Zugriffsbeschränkungen auferlegen. Diese Einschränkungen werden durch Zugriffsmodifikatoren festgelegt. Zugriffsmodifikatoren bestimmen die Sichtbarkeit von Klassen, Feldern und Methoden und damit deren Verwendbarkeit aus anderen Programmteilen. Es gibt vier Zugriffsmodifikatoren.

Private

Auf eine private Instanzvariable oder -methode kann von ausserhalb der Klasse nicht zugegriffen werden. Es ist eine gängige Praxis, Instanzvariablen privat zu halten. Wir möchten schliesslich nicht, dass jemand unsere Daten direkt manipuliert. Dieses Prinzip nennt man auch Kapselung.

1
2
3
class Person {
    private String name;
}

Klassen, welche als private deklariert werden sind immer sog. innere oder nested Klassen. Auf diese Klassen kann nur innerhalb der umhüllenden Klasse zugegriffen werden.

1
2
3
4
5
6
7
class Person {
    private class NestedPerson {
        //NestedPerson ist nur für die Klasse Person sichtbar
    }
    
    private String name;
}

UML-Symbol: -

Public

Auf Klassen, Felder und Methoden, die mit dem Schlüsselwort public deklariert sind, kann von einem beliebigen Ort des Programms zugegriffen werden. Sie sind also öffentlich.

1
2
3
4
5
6
7
public class Person {
	private String name;

	public String getName() {
		return name;
	}
}

Auf öffentliche Methoden und Felder kann ein Objekt über den Punkt-Operator zugreifen.

1
2
Person p = new Person();
p.getName();

UML-Symbol: +

Protected

Wenn ein Feld oder eine Methode mit protected deklariert ist, dann kann nur vom gleichen Package oder von Unterklassen darauf zugegriffen werden (Unterklassen folgen später im Modul Objektorientiertes Design).

Wichtig zu beachten ist, dass Subpackages von Java wie separate Packages behandelt werden. Dementsprechend kann die Klasse AccessClass.java, wenn die Struktur wie folgt aussieht, nicht auf Protected Members der Klasse ParentClass.java zugreifen.

1
2
3
4
5
6
src
└── ch
    └── sbb
        ├── ParentClass.java
        └── subpackage
            └── AccessClass.java

UML-Symbol: #

Package-Private

Wenn eine Klasse, ein Feld oder eine Methode keinen Zugriffsmodifikator hat, so besitzt sie trotzdem einen. Dieser wird Package-Private genannt. Die Sichtbarkeit ist grundsätzlich private, wird aber auf Klasse im gleichen Package ausgeweitet. Das bedeutet, dass andere Klassen innerhalb derselben Package, Zugriff auf diese Klasse, Felder und Methoden haben. Für Subpackages gilt das Gleiche wie bei Protected.

Zusammenfassung

ModifikatorEigene KlasseKlasse im gleichen Package / innere-KlassenUnterklassenSonstige Klassen
privatejaneinneinnein
publicjajajaja
protectedjajajanein
Keinen (package-private)jajanur im gleichen Packagenein