O modyfikatorach dostępu wspominaliśmy przy okazji rozdziału
Klasy i programowanie obiektowe. Obiecaliśmy wtedy,
że napiszemy o nich bardziej szczegółowo i ten moment właśnie nadszedł.
Wyróżniamy dwa typy modyfikatorów:
-
Modyfikatory dostępu - kontrolują poziom dostępu dla klas, pól, metod i konstruktorów.
-
Modyfikatory niedostępowe - nie kontrolują poziomu dostępu,
ale zapewniają inne funkcje
Modyfikatory dostępu dla klas
W przypadku klas można użyć modyfikatorów publicznych lub domyślnych:
- Modyfikator domyślny (default) oznacza, że klasa jest dostępna tylko dla klas
znajdujących się w tym samym pakiecie. Jest on używany, gdy nie określimy modyfikatora (czyli nie wpiszemy ani private, ani protected, ani public).
-
Modyfikator public
oznacza ze klasa jest dostępna z każdej innej klasy.
Modyfikatory dostępu dla pól, metod i konstruktorów
W przypadku pól, metod i konstruktorów można użyć jednego z następujących modyfikatorów dostępu:
- Modyfikator domyślny (default) oznacza dostęp domyślny, czyli używany wtedy, gdy nie określiśmy żadnego
modyfikatora. W praktyce oznacza to, że kod jest dostępny tylko w tym samym pakiecie.
-
Modyfikator public oznacza, że kod jest dostępny dla wszystkich klas.
-
Modyfikator private oznacza, że kod jest dostępny tylko w zadeklarowanej klasie (co ciekawe, w przypadku konstruktorów ma to takie znaczenie, że obiektu danej klasy nie stworzymy spoza tej klasy).
-
Modyfikator protected oznacza, że kod jest dostępny w tym samym pakiecie i podklasach.
Modyfikatory niedostępowe klas
W przypadku modyfikatorów "niedostępowych" wyróżniamy:
-
Modyfikator final oznaczający, że klasa nie może być dziedziczona przez inne klasy
(więcej informacji na temat dziedziczenia można znaleźć w rozdziale Klasy - Dziedziczenie (Inheritance)).
-
Modyfikator abstract oznaczający, że nie można użyć tej klasy do stworzenia obiektów.
Aby uzyskać dostęp do elementów klasy abstrakcyjnej, musimy rozszerzyć tą klasę inną klasą (nieabstrakcyjną).
Więcej informacji na temat klas abstrakcyjnych przedstawimy w osobnym rozdziale, już wkrótce.
Modyfikatory niedostępowe dla pól i metod
Jeśli chodzi o metody i pola:
-
Modyfikator final - pole nie może być zmodyfikowane oraz nadpisane, a metoda nie może być przesłonięta (o przesłanianiu metod piszemy w rozdziale Przesłanianie metod (Overriding))
-
Modyfikator static - pola i metody należą do klasy, a nie do obiektu. Polecamy Wam zajrzeć do rozdziału: Metody statyczne. Tam dowiecie się jeszcze więcej w tym temacie.
-
Modyfikator abstract - może być używany tylko w klasie abstrakcyjnej i używany tylko w metodach.
Metoda taka nie ma ciała, na przykład:
-
Modyfikator transient oznacza, że atrybuty i metody są pomijane podczas serializowania obiektu, jaki je zawiera.
-
Modyfikator synchronized oznacza, że dostęp do metod może uzyskać tylko jeden wątek naraz.
-
Modyfikator volatile oznacza, że wartość atrybutu nie jest buforowana lokalnie i zawsze
jest odczytywana z „pamięci głównej”
Przykład w programie
Zobaczmy teraz przykład ograniczania dostępu. Mamy zdefiniowane pliki (
Item i
Start) - oba pliki (a więc i zdefiniowane w nich klasy) znajdują się w tym samym pakiecie -
itemsappa.
Wszystkie metody są publiczne (w tym metoda
getId zawarta w klasie
Item).
Teraz zmieniamy modyfikator metody
getId na
private, a więc mamy:
W tym momencie wywołanie metody
getId przestaje się kompilować w naszej klasie
Start (linia 7 na obrazku poniżej). Metoda ta jest bowiem niewidoczna z poziomu innej klasy, nawet zawartej
w tym samym pakiecie. Dostęp do niej mamy tylko z poziomu klasy
Item.
Zmieniamy więc modyfikator dostępu na
protected, czyli teraz mamy:
W tej chwili wywołanie metody ponownie zaczyna się kompilować gdyż obie klasy znajdują się w tym samym pakiecie (
itemsappa).
Co się jednak stanie, gdy w ramach pakietu
itemsappa stworzymy pakiet
domain i tam przeniesiemy
nasz plik z klasą
Item?
Pamiętając, że nasza metoda jest zastrzeżona (tyle oznacza słowo
protected), nie powinna ona być widoczna z poziomu klasy
Start pozostającej nadal w pakiecie
itemsappa. Klasy nie znajdują się w tym samym pakiecie, ani też klasa
Start nie dziedziczy z klasy
Item.
Tak więc
protected tutaj nie zadziała.
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.