Wątek przeniesiony 2014-04-23 01:05 z Inżynieria oprogramowania przez Shalom.

Widoczność zmiennych klasowych JAVA

0

Witam,
mam takie teoretyczne pytanie:
Jak to jest z tymi specyfikatorami dostępu ?
public i package pozwala podklasom dziedziczyć.
A private ? Czy te zmienne określone w nadklasie z private będą dziedziczone ?
A protected ?
To co mnie interesuje to zachowanie się specyfikatorów w obliczu dziedziczenia.

0

Dziedziczone jest wszystko. Nie wszystko za to jest dostępne / widoczne.

0

A więc jaka to będzie zależność? Rozumiem, to będzie miało wpływ na widoczność zmiennych w klasie pochodnej ?

0

Modyfikatory dostępu, mają następujące znaczenie:

  • public - wszystkie klasy mają dostęp do pól danych i metod public,
  • private - dostęp do metod i pól danych posiadają jedynie inne metody tej samej klasy,
  • protected - metoda lub pole danych protected lub może być używana jedynie przez metody swojej klasy oraz metody wszystkich jej klas pochodnych,
    Źródło: http://arturt.republika.pl/java/Charakterystyka/2.3.htm
0

Trochę uzupełnię poprzednika.
Od największego dostępu:

  1. public - dostęp w każdym miejscu
  2. protected - dostęp tylko w bieżącej klasie, klasach wewnętrznych/zewnętrznych, klasach pochodnych (spoza pakietu) i klasach z tego samego pakietu
  3. brak modyfikatora (package private) - dostęp tylko w bieżącej klasie, klasach wewnętrznych/zewnętrznych i klasach z tego samego pakietu
  4. private - dostęp w bieżącej klasie i klasach wewnętrznych/zewnętrznych. Wszystkie metody prywatne są z automatu finalne dlatego nie da się ich dziedziczyć. A samego modyfikatora nie należy przy tych metodach używać.

Jeżeli chodzi o dziedziczenie, to klasy zaprojektowane jako bazowe (a w Javie może to być każda nie finalna) nigdy nie powinny wywoływać metod publicznych z innych metod publicznych bo każda z nich może zostać przesłonięta w klasie pochodnej. Wtedy jest to źródłem bardzo trudnych do wychwycenia błędów. To samo dotyczy metod chronionych - nie powinny one wywoływać metod publicznych, ani chronionych swojej własnej klasy. Dotyczy to nawet metod pakietowych - nie powinny one wywoływać, ani metod publicznych, ani chronionych, ani pakietowych swojej własnej klasy. Dlatego jeżeli masz sytuację w której potrzebujesz wywołać z jakiejś metody inną nieprywatną metodę, to należy kod tej metody przenieść do metody prywatnej, a następnie wywołanie tej metody prywatnej umieścić w obu miejscach. Jedynym wyjątkiem powinno być wywoływanie metod finalnych - bo one nie mogą zostać przesłonięte.

Tę technikę standardowo wykorzystuje się w konstruktorach, które nie powinny wywoływać żadnego kodu możliwego do przesłonięcia (dzisiaj każde IDE przed tym ostrzega). Ja to jednak rozszerzam również na każdą inną metodę bo bardzo dobrze się to sprawdza.

0

Jeżeli chodzi o dziedziczenie, to klasy zaprojektowane jako bazowe (a w Javie może to być każda nie finalna) nigdy nie powinny wywoływać metod publicznych z innych metod publicznych bo każda z nich może zostać przesłonięta w klasie pochodnej

Albo nie do końca cię rozumiem, albo to co napisałeś to jakaś bzdura. Słyszałeś kiedyś o takim wzorcu jak Template Method? To jest bardzo popularna rzecz i jest dokładnym zaprzeczeniem tego co napisałeś ;] Rozumiem że chodziło ci tutaj o zabezpieczenie się przed przypadkowym popsuciem klasy przez modyfikacje którejś z metod, ale jest wiele sytuacji kiedy zależy nam na tym żeby modyfikacja pewnej metody pociągała za sobą zmianę zachowania wszystkich metod które z niej korzystały.

0

Template method wcale nie jest z tym sprzeczna. W tym wzorcu przesłania się metody chronione/pakietowe. Metoda szablonowa wywołuje tylko przesłonięte metody chronione oraz mające niższy poziom dostępu, a ona sama jest często finalna.
Chodziło oczywiście o unikanie wywoływania metod publicznych (a ogólnie metod na tym samym poziomie dostępu) wyłącznie z tej samej klasy.

jest wiele sytuacji kiedy zależy nam na tym żeby modyfikacja pewnej metody pociągała za sobą zmianę zachowania wszystkich metod które z niej korzystały.

Masz rację, ale właśnie po to należy używać metod chronionych/pakietowych. Chyba niezbyt jasno sformułowałem swojego posta i stąd te wątpliwości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1