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.
- Rejestracja:prawie 16 lat
- Ostatnio:ponad 10 lat

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Dziedziczone jest wszystko. Nie wszystko za to jest dostępne / widoczne.
- Rejestracja:prawie 11 lat
- Ostatnio:ponad 10 lat
- Postów:71
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

- Rejestracja:ponad 16 lat
- Ostatnio:10 dni
- Lokalizacja:Polska, Warszawa
- Postów:1058
Trochę uzupełnię poprzednika.
Od największego dostępu:
- public - dostęp w każdym miejscu
- protected - dostęp tylko w bieżącej klasie, klasach wewnętrznych/zewnętrznych, klasach pochodnych (spoza pakietu) i klasach z tego samego pakietu
- brak modyfikatora (package private) - dostęp tylko w bieżącej klasie, klasach wewnętrznych/zewnętrznych i klasach z tego samego pakietu
- 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.

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
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.


- Rejestracja:ponad 16 lat
- Ostatnio:10 dni
- Lokalizacja:Polska, Warszawa
- Postów:1058
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.
ShalomShalom