Kurs Java

Modyfikatory dostępu i niedostępowe

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:
      abstract void run();
      
    • 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).
Klasy w jednym pakiecie
public class Start {

    public static void main(String[] args) {        
        Item item = new Item(1);
        System.out.println(item.getId());        
    }
}
Teraz zmieniamy modyfikator metody getId na private, a więc mamy:
public class Item {

    int id;
    
    public Item(int id) {
        this.id = id;
    }
    
    private int getId() {
        return id;
    }	
}
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.
Klasy w jednym pakiecie gdy metoda jest prywatna
Zmieniamy więc modyfikator dostępu na protected, czyli teraz mamy:
public class Item {

    int id;
    
    public Item(int id) {
        this.id = id;
    }
    
    protected int getId() {
        return id;
    }   
}
W tej chwili wywołanie metody ponownie zaczyna się kompilować gdyż obie klasy znajdują się w tym samym pakiecie (itemsappa).
Klasy w jednym pakiecie gdy metoda jest zastrzeżona
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.
Klasy w różnych pakietach gdy metoda jest zastrzeżona
Klasy w różnych metoda zastrzeżona - brak kompilacji
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Masz pytanie dotyczące tego rozdziału? Zadaj je nam!
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.
kursjava@javappa.com

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE