Die Zugriffsstufe protected erlaubt den Zugriff auf Instanzvariablen und Methoden außerhalb der eigenen Klasse für Klassen im selben package und darüber hinaus in vererbten Klassen.
Java besitzt insgesamt vier Zugriffsstufen, wovon protected eine ist. Die unterschiedlichen Stufen regeln die Sichtbarkeit von Membern einer Klasse (Instanzvariablen und Methoden). Das heißt, sie legen fest, in welchem Maß Code außerhalb der Klasse darauf zugreifen kann. Noch einmal zur Übersicht alle Zugriffsstufen:
Zugriffstufe | Klasse | Paket | Sub-Klasse | Welt |
---|---|---|---|---|
public | OK | OK | OK | OK |
protected | OK | OK | OK | - |
kein Modifier-Schlüsselwort (default) | OK | OK | - | - |
private | OK | - | - | - |
Die Zugriffsstufe protected erlaubt also den Zugriff auf Instanzvariablen und Methoden für die eigene Klasse, für Klassen im selben package und darüber hinaus in vererbten Klassen, auch wenn sie in einem anderem package sind:
Um eine Instanzvariable oder Methode als protected zu markieren, schreiben wir den Zugriffsmodifikator (access modifier) protected als erstes Schlüsselwort in der Variablendeklaration bzw. Methodendefiniton:
protected int fun = true;
protected void fly(){
//
}
Schauen wir uns nun eine geschützte Instanzvariable und eine geschützte Methode im Einsatz an:
package paket1;
public class Bird {
protected String action = "fly";
protected void fly(){
System.out.println(action);
}
}
Die Instanzvariable action und die Methode fly() sind in der Klasse Bird mit der Zugriffsstufe protected markiert. Erzeugen wir nun eine Unterklasse von Bird und greifen darauf zu:
package paket2;
import paket1.Bird;
public class Falcon extends Bird {
public Falcon(){
System.out.println(action); // fly
fly(); // fly
}
}
Die Unterklasse Falcon erbt von Bird. Wir können deshalb in Falcon direkt auf die Instanzvariable action und die Methode fly() zugreifen, denn beide sind protected. Dies tun wir im Konstruktor von Falcon.
Wären die Member in Bird als private markiert, wäre ein Zugriff in Falcon nicht möglich (unterschiedliche Klassen). Auch das Weglassen des Zugriffsmodifikators (default access) würde einen Compiler-Fehler hervorrufen, da Bird und Falcon nicht im selben package sind (paket1 und paket2).
Bedenken Sie aber: Auch wenn wir Instanzvariablen als protected markieren können, sollten wir in der Regel davon aber absehen und sie als privatedeklarieren, um die Kapselung zu stärken. Der Zugriff von anderen Klassen aus sollte indirekt über Methoden erfolgen.
Java Basics
[Java einrichten] [Variablen] [Primitive Datentypen] [Operatoren] [if else] [switch-case] [Arrays] [Schleifen]
Objektorientierung
[Einstieg] [Variablen ] [Konstruktor] [Methoden] [Rekursion] [Statische Member] [Initializer] [Pass-by-value] [Objektsammlungen] [Objektinteraktion] [Objekte löschen]
Klassenbibliothek
[Allgemeines] [String ] [Math] [Wrapper] [Scanner] [java.util.Arrays] [Date-Time-API]
Vererbung
[Einstieg Vererbung] [Konstruktoren bei Vererbung ] [Der protected Zugriffsmodifikator] [Abstrakte Klassen und Methoden] [Polymorphie in Java] [Typumwandlung] [Die Klasse Object] [Die toString()-Methode] [Objekte vergleichen] [Was ist ein Interface?]