Modyfikator dostępu protected pozwala na widoczność członkom klasy wewnątrz tego samego pakietu i we wszystkich podklasach (subclasses), nawet jeśli znajdują się w innych pakietach.
Różnice w porównaniu do innych modyfikatorów:
private — dostęp tylko w obrębie bieżącej klasyprotected — dostępny wewnątrz bieżącego pakietu i w dziedziczących poza pakietempublic — dostępny wszędziePrzykład:
package com.example.base; public class Parent { protected void sayHello() { System.out.println("Hello from parent"); } } package com.example.child; import com.example.base.Parent; public class Child extends Parent { public void tryHello() { sayHello(); // Dostęp jest! } } public class NotChild { public void fail(Parent p) { // p.sayHello(); // Błąd: brak dostępu } }
Czy zewnętrzna klasa (niebędąca dziedzicem) może uzyskać dostęp do metody
protectedz innego pakietu, mając obiekt tej klasy?
Odpowiedź: Nie, dostęp do metody protected z innego pakietu jest dozwolony tylko dla klas dziedziczących, i tylko przez this lub przez referencję do obiektu dziedziczącego, a nie do rodzica.
Parent p = new Child(); p.sayHello(); // Błąd! ((Child) p).sayHello(); // Sukces (jeśli wywołane wewnątrz Child)
Historia
W dużym projekcie modulowym programista umieścił ważne metody biznesowe w sekcji
protected, sądząc, że są one niedostępne poza pakietem. Inni programiści przypadkowo użyli tych metod w testach w tym samym pakiecie, a z powodu późniejszego przeniesienia klas pojawiły się nieoczekiwane błędy dostępu.
Historia
W projekcie mikrousług próbowałem wywołać metodę o dostępie protected za pomocą referencji do typu rodzica w innym pakiecie — wywołanie nie działało. Spowodowało to awarię części mechanizmów rozszerzania systemu, ponieważ opierano się na nieprawidłowym zrozumieniu zakresu widoczności.
Historia
W bibliotece open-source nieostrożnie użyto pól protected, które okazały się dostępne dla zbyt szerokiego kręgu klas, co pozwoliło przypadkowo uszkodzić wewnętrzny stan obiektu, powodując problemy w aplikacjach zewnętrznych.