Wpis z mikrobloga

Co oznacza modyfikator dostępu w przypadku klasy?
W tutorialu jest słowo "widoczność", ale nie rozumiem, co to oznacza?
Narazie dochodzę do wniosku, że modyfikator dostępu przy nazwie klasy narzuca na wszystkie składowe danej klasy "najszerszy" możliwy dostęp, czyli:
- klasa public, pole default -> pole widoczne jako default
- klasa default, pole public -> pole widoczne jako default
Konstruktory i metody tak samo jak pola ( czyli np. jeśli klasa public, jedyny konstruktor private to będzie poprawne, tylko klasa będzie bezużyteczna poza tą klasą poza przypadkami, że pośrednio to wywołam, jakąś np. statyczną metodą tej klasy )

Dobrze rozumiem?
#java #naukaprogramowania
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

via Wykop Mobilny (Android)
  • 0
@Lewo: najprościej, modyfikator określa z których miejsc w programie będzie można wykorzystać dany fragment kodu. Modyfikator przy klasie nie narzuca nic składowym, zwyczajnie klasa private będzie widoczna tylko dla samej siebie, ponieważ z żadnego innego miejsca nie będziesz miał jej wywołać.
  • Odpowiedz
Czytam https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
Nie mogę zrozumieć fragmentu

A class may be declared with the modifier public, in which case that class is visible to all classes everywhere. If a class has no modifier (the default, also known as package-private), it is visible only within its own package (packages are named groups of related classes — you will learn about them in a later lesson.)


Nie rozumiem po co określać class visible, skoro i tak określamy
  • Odpowiedz
@Lewo: Nie rozumiem po co określać class visible, skoro i tak określamy visible składowych (metod, pól, itd).

No właśnie po to samo.
Wyobraź sobie, że w projekcie może być więcej niż jedna klasa ( ͡° ͜ʖ ͡°) i jako ich autor chciałbyś "ukryć" niektóre szczegóły implementacji przed osobami które będą korzystać z Twoich rozwiązań.
  • Odpowiedz
Nie rozumiem po co określać class visible, skoro i tak określamy visible składowych (metod, pól, itd).


@Lewo: Przykładowo, gdyby nie było modyfikatorów dostępu dla klas to:
- w każdym pliku java mógłbyś zaimportować dowolną inną klasę z twojej aplikacji lub bibliotek (nawet taką używaną tylko lokalnie w pakiecie). W przypadku popularnych nazw i dużych aplikacji miałbyś dziesiątki klas do wyboru.
- pomimo, że metody i pola są prywatne samej klasy
  • Odpowiedz
@63274682374: ja to rozumiem tak: widoczność klasy pozwala na odniesienie się do klasy ( przy imporcie, czy jak podaje pełną ścieżkę w typie zmiennych np. mypkgA.MyClass variable = null;
czy gdy chcę się "dostać" do innych składowych klasy np. przy operatorze dot ( . ) ).

Jednak nachodzi mnie myśl - dlaczego mogę robić pola public w klasie default ( i tak do takich pól się nie dostanę poza pakietem,
  • Odpowiedz
@63274682374: i jeszcze jako argument za szerszymi klasami, a węższymi metodami dałbym przykład
pkgA.MyClass , MyClass publiczne, jedyny konstruktor protected, więc obiektu tej klasy nie zrobimy poza pakietem w klasie nie będącej potomkiem, ale odniesiemy się np. do publicznego pola statycznego tej klasy
  • Odpowiedz
Chyba, że podklasy mogą poszerzać widoczność klasy, wtedy odziedziczone pola mogą powiększyć swój zakres.


@Lewo: Tak, po to to jest. Przykładowo tworzysz abstrakcyjną klasę o dostępie pakietowym. W niej definiujesz pola i metody publiczne (bardziej metody niż pola #pdk). Dziedziczysz z niej już publiczną klasą. W efekcie poza pakietem możesz używać publicznych klas a klasa abstrakcyjna jest ukryta.

W przypadku metod jest sprawa jeszcze bardziej oczywista. Jeśli modyfikator na
  • Odpowiedz
@63274682374: apropo konstruktora prywatnego, czytałem, że to też sposób implementacji Singletona, gdzie tworzy się jedyny obiekt przez statyczną metodę, która wywołuje prywatny konstruktor.

Teraz ta "dowolność" mieszania modyfikatorów klas i składowych ma dla mnie sens, dzięki.
  • Odpowiedz
@63274682374: "...interfejsów gdzie wszystkie niedomyślne metody są zawsze public"


@Lewo: Oho, ale babol.
W interfejsie metody domyślne i abstrakcyjne są zawsze public.
Dodatkowo można definiować:
- statyczne metody - mogą być public (domyślnie) lub private
- zwykłe metody - muszą być private.
  • Odpowiedz