Specyfikatory dostępu i pakiety Drukuj
Ocena użytkowników: / 8
SłabyŚwietny 
Instrukcje dodatkowe - Programowanie w języku JAVA
Wpisany przez Administrator   

Z tej lekcji dowiesz się

- co to są specyfikatory dostępu (access modifiers)

- poznasz 4 rodzaje specyfikatorów:

  • publiczny
  • prywatny
  • chroniony
  • pakietowy

 

 

Specyfikatory dostępu pełnią bardzo ważną rolę w obiektowym programowaniu w języku Java.Pozwalają one na określenie praw dostępu do składowych klas oraz do samych klas. Spróbuję CI wytłumaczyć na czym polega rola tych specyfikatorów i po co one są odpowiedzialne.

Aby to zrozumieć posłużę się przykładem samochodu. Jeśli przyjrzymy się większości nowych samochodów (czy każdemu innemu złożonemu urządzeniu: pralka, telewizor, telefon komórkowy, pilot TV itd.) to zauważymy jedną cechę szczególną: użytkownik ma dostęp do pewnych funkcji urządzenia poprzez udostępnione dla niego przyciski, pokrętła itd., jednak nie może on wpływać na ustawione przez producenta właściwości urządzenia, do których z reguły ma serwisant. Dzieje się tak dlatego, że do poprawnego użytkowania samochodu zwykły użytkownik nie potrzebuje dostępu do zaawansowanych funkcji oraz np. interfejsów diagnostycznych. Pracownik warsztatu za to może się podłączyć swoim komputerem do komputera pokładowego samochodu, dzięki czemu przeprowadzi diagnostykę. Czyli dostęp do różnych obszarów działania samochodu nie jest jednakowy. Występuje tu rozgraniczenie na dostęp dla każdego, jak również dostęp dla zaawansowanych użytkowników. Dlaczego tak się dzieje? W przypadku samochodów - z prostej przyczyny: przeciętnemu użytkownikowi nigdy nie przydaje się dostęp do narzędzi diagnostycznych i nawet nie musi o nim wiedzieć. Co więcej, udostępnienie zwykłemu kierowcy wszystkich możliwych interfejsów oraz opcji spowodowałoby wrażenie, że samochód jest bardzo skomplikowany (bo w istocie jest) co negatywnie wpłynęłoby na komfort jego użytkowania. My potrzebujemy takiego interfejsu, który pozwoli nam w prosty i niezawodny sposób uruchomić samochód, zahamować, skręcać, włączać kierunkowskaz itd. Co więcej, bezpośredni dostęp do zaawansowanych ustawień poszczególnych podzespołów umożliwiłby zepsucie samochodu przez użytkownika. Znacznie trudniej zepsuć samochód używając tylko tych manipulatorów, które są udostępnione dla kierowcy. No i trzecia przyczyna: modyfikacje. Samochód można zmodyfikować wewnątrz (np. przerobić instalacje, jak w samochodach rajdowych lub np. dodać instalację gazową) nie zmieniając lub niewiele zmieniając to, co widzi kierowca. Czyli zasada działania pod maską samochodu zmienia ię diametralnie, natomiast kierowca nadal w sposób standardowy używa samochodu.

Bardzo analogicznie jest w przypadku programów w Javie: programista pisząc jakąś klasę nie musi odkrywać sposobu jej działania ani odsłaniać wszystkich jej mechanizmów dla innych klas czy użytkowników. To, co jest udostępnione "na zewnątrz", tzw. interfejs klasy (odpowiednik kokpitu kierowcy) wystarczy, aby w pełni wykorzystać możliwości klasy, ale bez możliwości grzebania w jej wnętrzu. Pisząc klasę udostępniamy na zewnątrz tylko to, co jest potrzebne do jej używania, a nie: zepsucia jej.

W języku java występuje następująca gradacja dostępu do obszarów klas (jak również samych klas):

  • public (dostęp publiczny)
  • private (dostęp prywatny)
  • protected (dostęp chroniony)
  • pakietowy

 

 


 

 

Dostęp publiczny: public

Jeśli ustawimy dostęp do klasy na publiczny, to dostęp do niej będą miały wszystkie inne klasy - nie będzie on ograniczony.

Zobaczmy to na przykładzie:

Zad. 1 Napisz klasę punkt, której pola: x oraz y będą miały dostęp publiczny.

Stwórz nowy projekt (Java Application) o nazwie punkty.

Oto kod naszej klasy.

Jak widzimy, specyfikator występuje na samym początku, przed typem zmiennej"

public double x;

public double y;

 

Podobnie rzecz ma się z metodami:

Zad. 2: Zmodyfikuj powyższy program tak, aby dodać publiczną metodę wyswietlX.

Jak widać, specyfikator public występuje również na początku przed typem metody:

public void wyswietlX(){

//kod metody

}

 

 


 

Dostęp prywatny - private

Dostęp prywatny to taki, gdzie dostęp do obiektu mają tylko składowe tej samej klasy. Oznacza to, że nie ma dostępu do obiektu dla innych klas oraz dla składowych tych innych klas. (odpowiednik elektroniki wewnętrznej w samochodzie, do której nie każdy ma dostęp). Zobaczmy to na przykładzie:

Zad. 3: Zmodyfikuj powyższy program tak, aby pola X oraz Y były polami prywatnymi (bez dostępu do nich z zewnątrz klasy).

 

To było chyba najłatwiejsze zadanie w całym kursie - trzeba było zmienić z public na private w dwóch miejscach.

Jaki jest efekt tego zabiegu? Teoretycznie z zewnątrz klasy nie można mieć bezpośrednio dostępu do pól x oraz y. Sprawdźmy to:

Zad. 4: Zmodyfikuj powyższy program tak, aby odwołać się do pól x oraz y spoza klasy.

Aby poprawnie napisać program musimy go troszkę przebudować:

1. Klasę punkt przenosimy poza klasę main oraz klasę Specyfikatory Znajdzie sie ona więc na samym początku pliku, zaraz po nazwie pakietu:

2. Następnie utworzymy obiekt klasy punkt i spróbujemy się odnieść do pola x tego obiektu:

3. Część naszej instrukcji jest podkreślona na czerwono, na marginesie pojawił się wykrzyknik na czerwonym tle. oto, jaka informację o błędzie pokazuje nam kompilator:

Oznacza to tyle, że pole x ma dostęp prywatny, więc nie można się do niego bezpośrednio odwołać spoza tej klasy. Jaki wobec tego mamy dostęp? Pośredni. Możemy stworzyć metodę, która będzie publiczna, natomiast jako część klasy będzie miała dostęp do pola x oraz y. W sumie to mamy już taka metodę gotową. Jest nią metoda wyswietlX. Spróbujmy wywołać tą metodę:

Zad. 5: Zmodyfikuj powyższy program tak, aby odnieść się do metody publicznej w celu wyświetlenia wartości pól prywatnych:

Próba wywołania metody zakończy się wyświetleniem domyślnej wartości dla pola double, (gdyż nie napisaliśmy żadnego konstruktora, który ustawiałby tą wartość).

Podobnie, jak w przypadku wyświetlania danych, ma się sprawa z ich modyfikacją. Również zrobi to za nas metoda publiczna:

 

Uruchamiamy program:

 

 

Zadanie utrwalające:

Zad. 6: zmodyfikuj powyższy program.  Dopisz metody, które będą pozwalały:

  • wyświetlić wartość pola y
  • zmienić wartość pola y
  • wyświetla wartość pola y

 

 


Pakiety

 

Pakiet jest to zbiór tematycznie powiązanych ze sobą klas, na ogół znajdujących się w obrębie jednego pliku.

Aby utworzyć pakiet należy użyć słowa kluczowego package, po którym następuje nazwa pakietu oraz średnik. Myśmy do tej pory używali pakietów w każdym nowym programie, ale nie zdawaliśmy sobie z tego sprawy, gdyż potrzebny kod generował za nas program NetBeans.

Jak widzimy na powyższym przykładzie, słowo kluczowe package musi być na początku pliku, przed niem mogą znajdować się tylko komentarze.

Aby to lepiej zrozumieć stworzymy nowy pakiet oraz nową klasę w obrębie tego pakietu.

 


 

1. najpierw tworzymy nowy pakiet, klikając tak, jak na ilustracji:

2. Nazwa pakietu to specyfikatory2. Po jej wpisaniu klikamy na Finish.

 


 

3. Teraz, w obrębie nowego pakietu stworzymy nową klasę. W tym celu klikamy kolejno tak, jak na ilustracji:

4. Nazwa klasy to punkt. Po jej wpisaniu klikamy na Finish.

5. Z naszego pliku z programem wycinamy cały kod klasy punkt ...

6. ... i wklejamy go do pliku klasy punkt

 

W ten sposób utworzyliśmy nowy pakiet z nową klasą, która definiuje obiekty klasy punkt.

 


 

Teraz, aby korzystać z dobrodziejstw tej klasy musimy ją zaimportować do naszego głównego programu. Robimy to poprzez odpowiedni wpis:

import nazwa_pakietu.nazwa_klasy;

Jednak po wpisaniu tego polecenia program zgłasza nam błąd. jaki?

Okazuje się, zresztą zgodnie z tym, co pisaliśmy, że klasa, aby ją zaimportować musi być publiczna.

Zmieniamy dostęp do klasy punkt w nowym pakiecie poprzez dopisanie specyfikatora public

Teraz nasz program już działa.

Co osiągnęliśmy?Teraz nasz program jest podzielony na 2 pakiety, gdzie w pakiecie specyfikatory znajduje się główna klasa programu, oraz w pakiecie specyfikatory2 znajduje się klasa punkt, którą importuje i używa nasz program.

W jakim celu robi się pakiety?

Odpowiedź jest prosta: z lenistwa, a raczej z niechęci do wykonywania wiele razy pracy, która już raz została wykonana. Chodzi o to, że większe programy składają się z wielu pakietów, które nie koniecznie trzeba pisać od nowa jeśli gdzieś już wcześniej zostały napisane, przez nas lub przez kogoś innego. Już na starcie, wraz z JDK otrzymujemy Javę oraz kilka tysięcy różnych pakietów z wieloma klasami, dzięki którym pewne klasy oraz metody (jak np. wyświetlanie tekstu czy liczenie) są napisane i nie musimy wszystkiego pisać od zera. teraz, kiedy będziemy pisać nowy program możemy użyć napisanej przez nas wcześniej klasy punkt, która jest bardzo uboga, ale możemy ja rozwijać. Z tej perspektywy pewnie łatwiej też zrozumieć dlaczego nie wszystko w klasie jest widoczne "na zewnątrz" tej klasy, niektóre pola oraz metody pozostają prywatne, programista udostępnia tylko pewien zbiór funkcji, dzięki której pełne korzystanie z tej klasy jest możliwe, ale inne klasy i pakiety niekoniecznie muszą mieć możliwość nieograniczonego i bezpośredniego dostępu do tych pól czy metod.

 

Zadanie do samodzielnego wykonania:

Ana

 


Dostęp chroniony - protected

 

Składowe klasy oznaczone modyfikatorem protected nie są dostępne publicznie, ale mają mniejsze ograniczenia niż private. Dostępne są dla:

-metod tej  samej klasy (podobnie, jak w przypadku modyfikatora private)

-klas potomnych (dziedziczących z tej klasy) oraz ich metod itd.

-klas znajdujących się w obrębie tego samego pakietu

 

Aby to zrozumieć i sprawdzić, przejdźmy do praktyki.

Zad. 7:

Analogicznie jak powyżej stwórz nową klasę punkt3d w pakiecie modyfikatory2, która dziedziczy z klasy punkt.

Oto wynik tego polecenia:

Zad. 8: Zmodyfikuj kod klasy punkt3d tak, żeby zawierała prywatne pole z oraz publiczną metodę wuświetlZ oraz ustawZ. Metoda ustawZ jako parametr pobiera wartość, na jaką ma być ustawiona wartość pola z.

Zad. 9:Zmodyfikuj kod klasy punkt3d tak, żeby klasa punkt3d zawierała metodę wyświetlXYZ, która wyświetla wartości pól x, y, oraz z.

Jak widać na powyższym listingu, program wyświetlił komunikat o błędzie przy linijkach dot. wyświetlania wartości pól x oraz y. Dlaczego tak się dzieje? Sprawdźmy treść komunikatu:

Zapomnieliśmy, że pola x oraz y klasy punkt są prywatne. Możemy problem rozwiązać na co najmniej 2 sposoby:

1) skorzystać z publicznych metod wyswietlX oraz wyswietlY, w ten sposób pozostawiając pola x oraz y prywatnymi

2) zmienić poziom dostępu tych pól na chronione - protected, dzięki czemu klasa punkt3d jako klasa dziedzicząca będzie miała do nich dostęp, nadal zaś będą niewidoczne dla klas w innych pakietach i tych, które nie dziedziczą z klasy punkt.

My, aby nauczyć się i przyswoić sobie nowe wiadomości wykonamy krok 3:

Zad. 10. Zmodyfikuj program tak, aby pola x oraz y klasy punkt miały chroniony poziom dostępu.

Jak widać na powyższym przykładzie, modyfikator protected przydaje się nieraz zwłaszcza tam, gdzie chcemy mieć dostęp do pola lub metody z poziomu klas potomnych, w obrębie jednego pakietu.

Jeszcze uruchommy program, żeby się upewnić, czy wszystko działa:

 

Ćwiczenie do samodzielnego wykonania:

Zad. 11: Zmodyfikuj powyższy program: dopisz chroniona metodę sumujXYZ, która sumuje wartości tych pól w klasie punkt. Wywołaj ją w klasie punkt3d w metodzie wyświetlSume, która wyświetla tą sumę.