10.06.19 10641 Views Kommentare [] 1 8

credit: ©Stefan/ stock.adobe

Java Tutorial #29

Der protected Zugriffsmodifikator in Java

In Java gibt es vier unterschiedliche Zugriffsstufen für Variablen und Methoden. Die ersten drei (private, public und default) kennen wir schon. Speziell für die Vererbung wichtig ist der "geschützte" Zugriff, der mit dem Modifier protected festgelegt wird.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Thema in Kurzform

  • 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.
protected int fun = true;

protected void fly(){
    //
}

    Inhaltsverzeichnis

  1. Was macht protected?
  2. Beispiel
  3. Übungen

Was macht protected?

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
protected
kein Modifier-Schlüsselwort (default)
private

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:

Java protected Zugriffsmodifikator

Beispiel

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 private deklarieren, um die Kapselung zu stärken. Der Zugriff von anderen Klassen aus sollte indirekt über Methoden erfolgen.

Übungen

einfach

Folgender Code ist gegeben:

package birds;

public class Owl {

    int w;
    public int x;
    protected int y;
    private int z;

}

Welche Variablen sind von außerhalb des Pakets birds sichtbar?

Zwei Antworten sind richtig!
A. Die Variable w
B. Die Variable x
C. Die Variable y
D. Die Variable y, aber nur von Subklassen
E. Die Variable z

Lösung ein-/ausblenden

mittel

Achtung, sehen Sie genau hin: Was wird am Bildschirm ausgegeben?

package paket1;

public class Vehicle {

    protected void drive(){
        System.out.println("I drive");
    }
}
package paket2;
import paket1.Vehicle;

public class Volvo{

    public static void main(String[] args){
        Volvo v = new Volvo();
        v.drive();
    }

}
Lösung ein-/ausblenden

schwer

Was ist das Resultat des folgenden Codes?

package paket1;

public class Bird {

    protected String action = "fly";

}
package paket2;

import paket1.Bird;

public class Falcon extends Bird {

  public static void main(String[] args) {

      Falcon x = new Falcon();
      System.out.println(x.action);

      Bird x2 = new Bird(); // Bird extends NO Bird!
      System.out.println(x2.action);  // Zugriff auf Bird-Reference

    }

}
Lösung ein-/ausblenden

Objektsammlungen

Lernen Sie in diesem Kapitel, wie Sie eine Sammlung von Objekten erstellen können.

Der Konstruktor

Was ist eigentlich ein Konstruktor?

Initializer

Eher selten aber praktisch!

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2022 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen