Der Zugriffsmodifikator protected ermöglicht es, dass Klassenmitglieder innerhalb desselben Pakets (package) und in allen Unterklassen (subclasses), auch wenn sie sich in anderen Paketen befinden, sichtbar sind.
Unterschiede zu anderen Modifikatoren:
private — Zugriff nur innerhalb der aktuellen Klasseprotected — innerhalb des aktuellen Pakets und in Erben außerhalb des Pakets verfügbarpublic — überall verfügbarBeispiel:
package com.example.base; public class Parent { protected void sayHello() { System.out.println("Hallo vom Elternteil"); } } package com.example.child; import com.example.base.Parent; public class Child extends Parent { public void tryHello() { sayHello(); // Zugriff ist vorhanden! } } public class NotChild { public void fail(Parent p) { // p.sayHello(); // Fehler: kein Zugriff } }
Kann eine äußere Klasse (die kein Erbe ist) über ein Objekt dieser Klasse auf eine
protected-Methode aus einem anderen Paket zugreifen?
Antwort: Nein, der Zugriff auf eine protected-Methode aus einem anderen Paket ist nur für erbende Klassen erlaubt und nur über this oder über eine Referenz auf ein Erbobjekt, nicht auf das Elternobjekt.
Parent p = new Child(); p.sayHello(); // Fehler! ((Child) p).sayHello(); // Erfolg (wenn innerhalb von Child aufgerufen)
Geschichte
In einem großen modularen Projekt platzierte ein Entwickler wichtige Geschäftsmethoden im
protected-Bereich, in der Annahme, dass sie außerhalb des Pakets nicht zugänglich sind. Andere Entwickler verwendeten diese Methoden versehentlich in Tests im selben Paket, und durch die spätere Verschiebung von Klassen traten unerwartete Zugriffsfehler auf.
Geschichte
In einem Mikroservices-Projekt wurde versucht, eine Methode mit
protected-Zugriff über eine Referenz auf den Elterntyp in einem anderen Paket aufzurufen — der Aufruf funktionierte nicht. Dies führte zu einem Ausfall vieler Erweiterungsmechanismen, da man von einem falschen Verständnis des Sichtbarkeitsbereichs ausging.
Geschichte
In einer Open-Source-Bibliothek wurden
protected-Feldern unachtsam verwendet, die zu weitreichend für viele Klassen verfügbar waren, sodass der innere Zustand des Objekts versehentlich beschädigt wurde, was Probleme in Drittanbieteranwendungen verursachte.