Tanuljon programozást Java-val

változó hatókör

minden változó csak abban a kontextusban érhető el (és érhető el), amelyen belül deklarálták. A kontextus meghatározásához tekintse meg a nyilatkozatot körülvevő legközelebbi nyitó és záró jeleket. A legtöbb programozási nyelv göndör zárójeleket használ ({}) a kódblokk kezdetének és végének jelölésére. Nézze meg ezt a példát:

egy változó hatóköre

itt nem kell minden kódot megérteni, csak a göndör zárójelekre kell összpontosítani. Ha egy változó elérhetőségéről beszélünk egy kontextusban, akkor a hatókörre utalunk. Itt láthatja, hogy a root változót deklarálták a lilával körözött két göndör zárójel között. Ennek a változónak a hatóköre minden a két zárójel között.

a változó hatóköre lehet lokális és globális is, attól függően, hogy hol deklarálják a változót. Egy globális változó a programon belüli összes osztály és metódus számára elérhető, míg egy helyi változó csak abban a metódusban érhető el, amelyben deklarálva van:

helyi vs globális hatókör

itt, kicsit kibővítettük a kódot, és kiterjesztettük az első kódblokkot egy másikra! Ha nyomon követi a lila vonalakat, láthatja, hogy az első blokk zárójelei magukban foglalják a második kód összes kódját. Ezután láthatja, hogy egy új változó, spy, deklarálva lett a zöld helyi hatókörön belül.

mivel a root változó a globális hatókörben deklarálva van, ez azt jelenti, hogy a lila zárójelben minden elérhető, beleértve a helyi hatókörben deklarált mindent. A második kódblokkban egy sor látható közvetlenül a kémváltozó deklarációja alatt, amely root. Ez megengedett!

azonban bármi, ami a helyi hatókörben van, nem érhető el a globális hatókörben vagy bármely más helyi kódblokkban. Nézzünk meg egy másik példát:

több hatókör

itt egy újabb kódblokkot adtunk hozzá, amelynek saját helyi hatóköre és saját változója van, anotherSpy. Most nézd meg az utolsó sort a kém változó blokk:

System.out.println(anotherSpy); // Error

úgy néz ki, van egy hiba! Ez azért van, mert a anotherSpy változót próbálja használni. De nem lehet, mert a anotherSpy nem tartozik sem a globális hatókörbe, sem a helyi hatókörbe. Ez azt jelenti, hogy ez a kódblokk nem fér hozzá. anotherSpy csak abban a kódblokkban érhető el, amelyben deklarálták.

ugyanez igaz a másik irányba is. Láthatja, hogy az utolsó kódblokk utolsó sorában is hiba van:

System.out.println(spy); // Error

itt a spy változót próbálja használni egy másik kódblokkból. De nem lehet, mivel a spy nem ugyanabban a hatókörben van, mint a használni kívánt kódblokk.

változó hatóköre az osztályokban

amikor deklarál egy osztályt, ugyanazok az Általános hatókörszabályok érvényesek: minden változó csak a Deklarációs blokkján belül érhető el. Kísérletezzünk egy unicorn osztály:

Unicorn osztály

csakúgy, mint az első példában, vannak globális osztály változók, valamint a helyi is. Nézzük át részletesen:

  • aheightéspower változók az osztály mezői, és az osztályon belül bárhol elérhetők.

  • a minutesToSleep változó csak a deklarált kódblokk helyi hatókörén belül érhető el.

  • a minutesToRun változó csak a deklarált kódblokk helyi hatókörén belül érhető el.

a változó hatóköre definíció szerint korlátozza annak hozzáférhetőségét. Az osztálymezők azonban az osztályon kívül is elérhetők, és bármely más kódblokk használhatja őket.

példánkban ezek aheightéspower. Ha Deklarálunk egy unikornis változót, akkor elolvashatjuk vagy megváltoztathatjuk ezeket az értékeket:

az osztályváltozókkal való rendetlenség súlyos következményekkel járhat. A jó hír az, hogy ezt ellenőrizheti! Mielőtt megnéznénk, hogyan, mindenképpen gyakoroljon változó hatókörrel.

próbáld ki magad!

hozzáférés-vezérlés

a hozzáférés-vezérlés ötletét egy osztály, modul vagy fájl korlátozott hozzáférésének megvalósításával fogjuk használni. Már tudja, mi az osztály és a fájl, mióta velük dolgozunk!

a modul egy névhez társított kapcsolódó forrásfájlok csomagja, például egy keretrendszer. A keretrendszer olyan funkciók összessége, amelyeket egy adott kontextus csoportosít. Felgyorsítja a fejlesztési folyamatot, és útmutatást nyújt a kód megírásához.

minden fejlesztői környezet számos keretrendszert biztosít. Az a tény, hogy ezeknek a keretrendszereknek a megvalósítása messze túlmutat azon, amit az őket használó fejlesztők láthatnak és kihasználhatnak. Ez úgy történik, hogy korlátozza a hozzáférést a végrehajtás részleteihez, más néven a hozzáférés-vezérlés végrehajtásához.

vezérlési szintek

a Java-ban az egyik kulcsszót kell használni a vezérlési szint kijelöléséhez:

  • nyilvános: látható a világ számára, ezért a legkevésbé korlátozó

  • védett: látható a csomag és annak összes alosztálya számára

  • Package-protected: általában csak annak a csomagnak látható, amelyben vannak (alapértelmezett beállítások)

  • privát: csak abban a kontextusban érhető el, amelyben meg vannak határozva (az osztályon belül található)

ezeknek a különálló korlátozásoknak a bevezetése sokkal könnyebbé teszi a fejlesztést. Nem kell aggódnia a végrehajtás nem kívánt láthatósága miatt, és még inkább a nem kívánt módosítások miatt.

helyezzen egy megfelelő kulcsszót a kapcsolódó nyilatkozat elé:

ezután, ha megpróbál hozzáférni az osztályon kívüli privát tagokhoz, hibákat kap:

a vezérlési szintek osztályelemekhez és osztályokhoz is rendelhetők:

public class PublicClass {}private class PrivateClass {}

a biztonság mellett a vezérlési szintek meghatározása az osztály tagjai számára jobb olvashatóságot biztosít. Amikor a fejlesztő készen áll egy forrásfájlra, mindig világos, hogy mely elemek használhatók külsőleg.

A vezérlés hierarchiája

egy elemnek ugyanolyan vagy korlátozóbb vezérlési szintje lehet, mint a tartalmazó elemének:

a fenti példában az osztály deklarálva van public. Mivel az osztály A tartalmazó elem, ez azt jelenti, hogy az osztály összes eleme azonos vagy kisebb expozíciós szintű lehet. Ebben az esetben minden szintet tartalmaz.

Ha egy osztályt private néven deklarálsz, akkor annak elemei csak package-private vagy 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() { }}

a fenti példában hozzáadtunk egy attribútum explicit hozzáférés-vezérlési kulcsszó nélkül. Ebben a forgatókönyvben alapértelmezés szerint feltételezi a tartalmazó elem szintjét. Ebben az esetben ez a mi osztályunk, tehát feltételezi a PrivateClassszintjét.

a legfelső szintű osztály nem jelölhető privátnak, de alapértelmezettként beállítva a csomag által védett szintre helyezi. Egy osztály változójának deklarálásakor, ha a Deklarációs kontextus vezérlési szintje magasabb, mint az osztályé, a változónak explicit vezérlési szinttel is rendelkeznie kell. Deklaráljuk a FileprivateClass változót:

String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok

mint látható, ha a változó kontextusának Alapértelmezett hozzáférési szintje magasabb, mint egy hozzá rendelt osztály, akkor kifejezetten meg kell adnia a változó szintjét, mint az osztály szintjét.

Összegzés

ebben a fejezetben a változó akadálymentességéről tanultál:

  • a változó hatóköre az a kódterület, ahol deklarálták.

  • az Általános változó hatóköre minden kódblokkra vonatkozik, beleértve az osztályokat is.

  • a változók és függvények elérésének másik szükséges módja a vezérlőszintek használata: nyilvános, védett, csomagvédett és privát.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.