Jetzt anmelden...

Name
Passwort
Registrieren

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.

Kommentare [0]

Stefan 10.06.2019

Infos zum Artikel

Kategorie Java
Autor Stefan
Datum 10.06.2019

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(){
    //
}

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 Resulatat der 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

Kommentar schreiben

Nur angemeldete Benutzer können kommentieren.

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Konstruktoren bei Vererbung

Trainieren Sie ihre Konstruktoren-Skills

Arrays in Java

Arrays ermöglichen das Speichern von Daten in einer übergeordneten Datenstruktur

Pass-by-value in Java

wie genau der Vorgang der Parameterübergabe bei Methoden abläuft, klären wir hier.

FALCONBYTE.NET

Handmade with 🖤️

© 2018, 2019 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen