zakres zmiennych
każda zmienna jest dostępna (i dostępna) tylko w kontekście, w którym została zadeklarowana. Aby określić kontekst, należy zapoznać się z najbliższymi znakami otwierającymi i zamykającymi, które otaczają deklarację. Większość języków programowania używa nawiasów klamrowych ({}
) do oznaczania początku i końca bloku kodu. Zobacz ten przykład:
nie ma potrzeby, aby zrozumieć każdy fragment kodu; wystarczy skupić się na klamrach. 🙂 Kiedy mówimy o dostępności zmiennej w kontekście, mamy na myśli zakres. Tutaj możesz zobaczyć, że zmienna root
została zadeklarowana pomiędzy dwoma nawiasami klamrowymi zakreślonymi na fioletowo. Zakres tej zmiennej jest wszystkim pomiędzy tymi dwoma szelkami.
zakres zmiennej może być zarówno lokalny, jak i globalny, w zależności od tego, gdzie jest zadeklarowana zmienna. Zmienna globalna może być dostępna dla wszystkich klas i metod w programie, podczas gdy zmienna lokalna może być dostępna tylko w metodzie, w której jest zadeklarowana:
tutaj, rozszerzyliśmy trochę kod i rozszerzyliśmy nasz pierwszy blok kodu o kolejny! Jeśli prześledzisz fioletowe linie, zobaczysz, że nawiasy z pierwszego bloku obejmują cały kod z drugiego. Następnie możesz zobaczyć, że nowa zmienna, spy
, została zadeklarowana w zielonym zasięgu lokalnym.
ponieważ zmiennaroot
została zadeklarowana w zasięgu globalnym, co oznacza, że jest dostępna dla wszystkiego w fioletowych nawiasach, w tym dla wszystkiego zadeklarowanego w zasięgu lokalnym. W drugim bloku kodu, możesz zobaczyć linię tuż pod deklaracją zmiennej szpiegowskiej, która używa root
. To dozwolone!
jednak cokolwiek znajduje się w zasięgu lokalnym, nie jest dostępne dla zasięgu globalnego, ani żadnych innych lokalnych bloków kodu. Spójrzmy na inny przykład:
tutaj dodaliśmy kolejny blok kodu, który ma własny lokalny zakres i własną zmienną, anotherSpy
. Teraz sprawdź ostatnią linię w naszym bloku zmiennych szpiegowskich:
System.out.println(anotherSpy); // Error
wygląda na to, że wystąpił błąd! To dlatego, że próbuje użyć zmiennej anotherSpy
. Ale nie może, ponieważ anotherSpy
nie jest ani w zasięgu globalnym, ani w tym samym zasięgu lokalnym. Oznacza to, że ten blok kodu nie ma do niego dostępu. anotherSpy
jest dostępny tylko w bloku kodu, w którym został zadeklarowany.
to samo jest prawdziwe w innym kierunku. Możesz zobaczyć, że ostatnia linia naszego ostatniego bloku kodu również ma błąd:
System.out.println(spy); // Error
tutaj próbuje użyć zmiennej spy z innego bloku kodu. Ale nie może, ponieważspy
nie jest w tym samym zakresie, co blok kodu, który próbuje go użyć.
zakres zmiennych w klasach
Kiedy deklarujesz klasę, obowiązują te same ogólne zasady zakresów: każda zmienna jest dostępna tylko w jej bloku deklaracji. Poeksperymentujmy z klasą jednorożca:
podobnie jak w naszym pierwszym przykładzie, istnieją globalne zmienne klasy, a także lokalne. Przejrzyjmy szczegółowo:
-
zmienne
height
Ipower
są polami klasy i są dostępne w dowolnym miejscu w klasie. -
zmienna
minutesToSleep
jest dostępna tylko w lokalnym zasięgu bloku kodu, w którym jest zadeklarowana. -
zmienna
minutesToRun
jest dostępna tylko w lokalnym zasięgu bloku kodu, w którym jest zadeklarowana.
zakres zmiennej ogranicza jej dostępność z definicji. Jednak pola klasy są dostępne poza klasą i mogą być używane przez każdy inny blok kodu.
w naszym przykładzie są toheight
Ipower
. Jeśli zadeklarujemy zmienną jednorożca, możemy odczytać lub zmienić te wartości:
możliwość mieszania się ze zmiennymi klasowymi może mieć poważne konsekwencje. Dobra wiadomość jest taka, że możesz to kontrolować! Zanim sprawdzimy, jak, pamiętaj, aby ćwiczyć ze zmiennym zakresem.
Wypróbuj sam!
Kontrola dostępu
zamierzamy wykorzystać ideę kontroli dostępu poprzez implementację ograniczonego dostępu do klasy, modułu lub pliku. Już wiesz, czym są klasy i akta, odkąd z nimi pracujemy!
moduł jest pakietem powiązanych plików źródłowych powiązanych z nazwą, jak framework. Framework to zbiór funkcjonalności pogrupowanych według określonego kontekstu. Przyspiesza proces tworzenia i zapewnia wskazówki dotyczące pisania kodu.
istnieje wiele frameworków dostarczanych przez każde środowisko programistyczne. Faktem jest, że implementacja tych frameworków znacznie wykracza poza to, co programiści, którzy ich używają, mogą zobaczyć i wykorzystać. Odbywa się to poprzez ograniczenie dostępu do szczegółów implementacji, znanej również jako implementacja kontroli dostępu.
poziomy kontroli
w Javie musisz użyć jednego ze słów kluczowych, aby wyznaczyć poziom kontroli:
-
Public: widoczny dla świata i dlatego najmniej restrykcyjny
-
Protected: widoczny dla pakietu i wszystkich jego podklas
-
package-protected: zazwyczaj widoczne tylko dla pakietu, w którym się znajdują (ustawienia domyślne)
-
prywatne: dostępne tylko w kontekście, w którym są zdefiniowane (wewnątrz klasy, w której się znajduje)
wprowadzenie tych odrębnych ograniczeń znacznie ułatwia rozwój. Nie musisz się martwić o niechcianą widoczność Twojej implementacji, a tym bardziej o niechciane modyfikacje.
umieść odpowiednie słowo kluczowe przed odpowiednią deklaracją:
wtedy, jeśli spróbujesz uzyskać dostęp do członków prywatnych spoza klasy, otrzymasz błędy:
poziomy kontroli mogą być przypisane do elementów klasy, jak również klas:
public class PublicClass {}private class PrivateClass {}
oprócz bezpieczeństwa, określenie poziomów kontroli dla członków klasy zapewnia lepszą czytelność. Kiedy programista przygotowuje plik źródłowy, zawsze jest jasne, które elementy mogą być używane zewnętrznie.
hierarchia kontroli
element może mieć taki sam lub bardziej restrykcyjny poziom kontroli niż jego zawierający element:
w powyższym przykładzie klasa jest zadeklarowana jakopublic
. Ponieważ klasa jest elementem zawierającym, oznacza to, że wszystkie elementy tej klasy mogą mieć ten sam lub mniejszy poziom narażenia. W tym przypadku obejmuje wszystkie poziomy.
Jeśli zadeklarujesz klasę jako private
, jej elementami mogą być tylko package-private
lub private
:
class PrivateClass { int internalProperty = 0; // automatically assigned package-private by default protected defaultProperty = true; // automatically assigned package-private public boolean publicProperty = true; // automatically converted to package-private private String fileprivateProperty = "Hello!"; //only available to the class private static void privateMethod() { }}
w powyższym przykładzie dodaliśmy atrybut bez wyraźnego słowa kluczowego Access Control. W tym scenariuszu domyślnie przyjmuje poziom elementu zawierającego. W tym przypadku jest to nasza klasa, więc przyjmuje poziom PrivateClass
.
klasa najwyższego poziomu nie może być oznaczona jako prywatna, ale ustawienie jej jako domyślnej spowoduje umieszczenie jej na poziomie chronionym pakietem. Deklarując zmienną klasy, jeśli poziom kontroli kontekstu deklaracji jest wyższy niż poziom klasy, zmienna musi również mieć jawny poziom kontroli. Zadeklarujmy zmienną FileprivateClass:
String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok
jak widać, jeśli domyślny poziom dostępu do kontekstu zmiennej jest wyższy niż klasa, którą do niej przypisujesz, musisz jawnie określić poziom zmiennej jako taki sam lub niższy niż poziom klasy.
podsumowanie
w tym rozdziale nauczyłeś się o dostępności zmiennych:
-
zakres zmiennej jest obszarem kodu, w którym została zadeklarowana.
-
zakres zmiennej ogólnej dotyczy wszystkich bloków kodu, w tym klas.
-
innym niezbędnym sposobem kontrolowania dostępu do zmiennych i funkcji jest użycie poziomów kontroli: public, protected, package-protected I private.