domeniul variabil
fiecare variabilă este disponibilă (și accesibilă) numai în contextul în care a fost declarată. Pentru a determina contextul, consultați cele mai apropiate semne de deschidere și închidere care înconjoară declarația. Majoritatea limbajelor de programare folosesc acolade ({}
) pentru a marca începutul și sfârșitul unui bloc de cod. Consultați acest exemplu:
nu este nevoie să înțeleagă fiecare bit de cod aici; doar se concentreze pe acolade buclat. Când vorbim despre disponibilitatea unei variabile într-un context, ne referim la domeniul de aplicare. Aici, puteți vedea că variabila root
a fost declarată între cele două bretele ondulate încercuite în violet. Domeniul de aplicare al acestei variabile este totul între cele două bretele.
domeniul de aplicare al unei variabile poate fi atât local, cât și global, în funcție de locul în care este declarată o variabilă. O variabilă globală poate fi disponibilă pentru toate clasele și metodele dintr-un program, în timp ce o variabilă locală poate fi disponibilă numai în cadrul metodei declarate în:
aici, am extins puțin codul și am extins primul nostru bloc de cod pentru a include altul! Dacă urmăriți liniile purpurii, puteți vedea că parantezele din primul bloc cuprind tot codul din cel de-al doilea. Apoi, puteți vedea că o nouă variabilă, spy
, a fost declarată în domeniul verde local.
deoarece variabilaroot
a fost declarată în domeniul global, aceasta înseamnă că este accesibilă tuturor celor din parantezele violet, inclusiv tuturor celor declarate în domeniul local. În al doilea bloc de cod, puteți vedea o linie chiar sub declarația variabilei spion care utilizează root
. E permis!
cu toate acestea, orice este în domeniul local nu este disponibil pentru domeniul global, sau orice alte blocuri locale de cod. Să aruncăm o privire la un alt exemplu:
aici am adăugat un alt bloc de cod, care are propriul domeniu local și propria variabilă, anotherSpy
. Acum, verificați ultima linie din blocul nostru de variabile spion:
System.out.println(anotherSpy); // Error
se pare că există o eroare! Asta pentru că încearcă să folosească variabila anotherSpy
. Dar nu se poate deoareceanotherSpy
nu este nici în domeniul global, nici în același domeniu local. Asta înseamnă că acest bloc de cod nu-l poate accesa. anotherSpy
este disponibil numai în blocul de cod în care a fost declarat.
același lucru este valabil și în cealaltă direcție. Puteți vedea că ultima linie a ultimului nostru bloc de cod are, de asemenea, o eroare:
System.out.println(spy); // Error
aici, încearcă să folosească spionul variabil dintr-un alt bloc de cod. Dar nu poate deoarece spy
nu este în același domeniu ca blocul de cod care încearcă să-l folosească.
domeniul de aplicare al variabilei în clasele
când declarați o clasă, se aplică aceleași reguli generale de definire a domeniului: fiecare variabilă este accesibilă numai în blocul său de declarații. Să experimentăm cu o clasă unicorn:
la fel ca în primul nostru exemplu, există variabile de clasă globală, precum și cele locale. Să analizăm în detaliu:
-
variabilele
height
șipower
sunt câmpuri ale clasei și sunt accesibile oriunde în clasă. -
variabila
minutesToSleep
este accesibilă numai în sfera locală a blocului de cod în care este declarat. -
variabila
minutesToRun
este accesibilă numai în sfera locală a blocului de cod în care este declarat.
domeniul de aplicare al unei variabile limitează accesibilitatea prin definiție. Cu toate acestea, câmpurile de clasă sunt accesibile în afara clasei și pot fi utilizate de orice alt bloc de cod.
în exemplul nostru, acestea sunt height
și power
. Dacă declarăm o variabilă Unicorn, putem citi sau modifica acele valori:
a fi capabil să te încurci cu variabilele clasei poate avea consecințe grave. Vestea bună este – puteți controla asta! Înainte de a verifica cum, asigurați-vă că practicați cu domeniul variabil.
încercați-l pentru tine!
Control Acces
vom folosi ideea de control acces prin implementarea accesului restricționat la o clasă, modul sau fișier. Știți deja ce sunt o clasă și un fișier de când lucrăm cu ei!
un modul este un pachet de fișiere sursă asociate cu un nume, cum ar fi un cadru. Un cadru este un set de funcționalități grupate într-un anumit context. Acesta accelerează procesul de dezvoltare și oferă îndrumări cu privire la modul de scriere a codului.
există un număr de cadre furnizate de fiecare mediu de dezvoltare. Faptul este că punerea în aplicare a acestor cadre este mult dincolo de ceea ce dezvoltatorii care le folosesc pot vedea și utiliza. Acest lucru se face prin restricționarea accesului la detaliile implementării, cunoscute și sub numele de implementarea controlului accesului.
niveluri de Control
în Java, trebuie să utilizați unul dintre cuvintele cheie pentru a desemna un nivel de control:
-
Public: vizibil pentru lume și, prin urmare, cel mai puțin restrictiv
-
protejat: vizibil pentru pachet și toate subclasele sale
- : de obicei vizibil doar pentru pachetul în care se află (setări implicite)
-
privat: accesibil numai în contextul în care sunt definite (în interiorul clasei în care se află)
punerea în aplicare a acestor restricții distincte face dezvoltarea mult mai ușoară. Nu trebuie să vă faceți griji cu privire la orice vizibilitate nedorite de punere în aplicare și mai mult, modificări nedorite.
Plasați un cuvânt cheie adecvat în fața declarației aferente:
apoi, dacă încercați să accesați membri privați din afara clasei, primiți erori:
nivelurile de control pot fi atribuite elementelor de clasă, precum și claselor:
public class PublicClass {}private class PrivateClass {}
În plus față de securitate, specificarea nivelurilor de control pentru membrii clasei oferă o mai bună lizibilitate. Când un dezvoltator pregătește un fișier sursă, este întotdeauna clar ce elemente pot fi utilizate extern.
ierarhia controlului
un element poate avea același nivel de control sau mai restrictiv decât elementul său care conține:
în exemplul de mai sus, clasa este declarată capublic
. Deoarece clasa este elementul care conține, aceasta înseamnă că toate elementele acelei clase pot avea același nivel de expunere sau mai mic. În acest caz, include toate nivelurile.
dacă declarați o clasă ca private
, elementele sale pot fi doar package-private
sau 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() { }}
în exemplul de mai sus, am adăugat un atribut fără un cuvânt cheie explicit de control al accesului. În acest scenariu, în mod implicit, acesta presupune nivelul elementului care conține. În acest caz, este clasa noastră, deci presupune nivelul PrivateClass
.
o clasă de nivel superior nu poate fi marcată privat, dar setarea ca implicită o va plasa în nivelul protejat de pachet. La declararea unei variabile a unei clase, dacă nivelul de control al contextului declarației este mai mare decât cel al clasei, variabila trebuie să aibă și un nivel de control explicit. Să declarăm o variabilă FileprivateClass:
String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok
după cum puteți vedea, dacă nivelul de acces implicit al contextului variabilei este mai mare decât o clasă pe care o atribuiți, trebuie să specificați în mod explicit nivelul variabilei ca fiind același sau mai mic decât cel al clasei.
rezumat
În acest capitol, ați învățat despre accesibilitatea variabilelor:
-
un domeniu de aplicare al unei variabile este zona de cod în care a fost declarată.
-
domeniul variabil General se aplică tuturor blocurilor de cod, inclusiv claselor.
-
un alt mod necesar de a controla accesul la variabile și funcții este utilizarea nivelurilor de control: public, protejat, protejat prin pachete și privat.