lär dig programmering med Java

variabel scoping

varje variabel är endast tillgänglig (och tillgänglig) i det sammanhang inom vilket den har deklarerats. För att bestämma sammanhanget, se de närmaste öppnings-och stängningsmärkena som omger deklarationen. De flesta programmeringsspråk använder lockiga hängslen ({}) för att markera början och slutet på ett kodblock. Kolla in det här exemplet:

omfattningen av en variabel

det finns ingen anledning att förstå varje bit av kod här; bara fokusera på de lockiga hängslen. När vi pratar om tillgängligheten av en variabel inom ett sammanhang hänvisar vi till omfattning. Här kan du se att variabeln root har deklarerats mellan de två lockiga hängslen cirklade i lila. Omfattningen av den variabeln är allt mellan dessa två hängslen.

omfattningen av en variabel kan vara lokal såväl som global, beroende på var en variabel deklareras. En global variabel kan vara tillgänglig för alla klasser och metoder inom ett program medan en lokal variabel kanske bara är tillgänglig inom den metod som den deklareras i:

lokal vs global omfattning

här, vi har utökat koden lite och utökat vårt första kodblock för att inkludera en annan! Om du spårar de lila linjerna kan du se att parenteserna från det första blocket omfattar all kod från den andra. Därefter kan du se att en ny variabel, spy, har deklarerats inom det gröna lokala omfånget.

eftersom variabelnroot har deklarerats i det globala omfånget, betyder det att den är tillgänglig för allt inom de lila parenteserna, inklusive allt som deklareras i det lokala omfånget. I det andra kodblocket kan du se en rad strax under spy-variabeldeklarationen som använder root. Det är tillåtet!

vad som än finns i det lokala omfånget är dock inte tillgängligt för det globala omfånget eller några andra lokala kodblock. Låt oss ta en titt på ett annat exempel:

Multiple scopes

Här har vi lagt till ett annat kodblock, som har sitt eget lokala omfång och sin egen variabel, anotherSpy. Kolla nu in den sista raden i vårt spionvariabelblock:

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

ser ut som om det finns ett fel! Det beror på att det försöker använda anotherSpy variabel. Men det kan inte eftersom anotherSpy varken ligger inom det globala omfånget eller i samma lokala omfång. Det betyder att detta kodblock inte kan komma åt det. anotherSpy är endast tillgängligt i det kodblock som det har deklarerats i.

detsamma gäller i andra riktningen. Du kan se att den sista raden i vårt sista kodblock också har ett fel:

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

Här försöker den använda variabeln spy från ett annat kodblock. Men det kan inte eftersom spy inte ligger i samma omfattning som kodblocket som försöker använda det.

Variabelomfång i klasserna

När du deklarerar en klass gäller samma allmänna regler för scoping: varje variabel är endast tillgänglig inom dess deklarationsblock. Låt oss experimentera med en enhörningsklass:

Unicorn class

precis som i vårt första exempel finns det globala klassvariabler såväl som lokala. Låt oss granska i detalj:

  • variablerna height och power är fält i klassen och är tillgängliga var som helst inom klassen.

  • variabeln minutesToSleep är endast tillgänglig inom det lokala tillämpningsområdet för det kodblock som det deklareras i.

  • variabeln minutesToRun är endast tillgänglig inom det lokala tillämpningsområdet för det kodblock som det deklareras i.

omfattningen av en variabel begränsar dess tillgänglighet per definition. Klassfält är dock tillgängliga utanför klassen och kan användas av alla andra kodblock.

i vårt exempel är de height och power. Om vi förklarar en Enhörningsvariabel kan vi läsa eller ändra dessa värden:

att kunna röra sig med klassvariabler kan få allvarliga konsekvenser. Den goda nyheten är – du kan kontrollera det! Innan vi kolla in hur, var noga med att träna med variabel scoping.

prova själv!

åtkomstkontroll

Vi kommer att använda tanken på åtkomstkontroll genom att implementera begränsad åtkomst till en klass, modul eller fil. Du vet redan vad en klass och en fil är eftersom vi har arbetat med dem!

en modul är en bunt relaterade källfiler associerade med ett namn, som ett ramverk. Ett ramverk är en uppsättning funktioner grupperade efter ett visst sammanhang. Det påskyndar utvecklingsprocessen och ger vägledning om hur man skriver koden.

det finns ett antal ramar som tillhandahålls av varje utvecklingsmiljö. Faktum är att implementeringen av dessa ramar är långt utöver vad utvecklarna som använder dem kan se och använda. Det görs genom att begränsa åtkomsten till detaljerna i implementeringen, även känd som implementering av åtkomstkontroll.

kontrollnivåer

i Java måste du använda ett av nyckelorden för att ange en kontrollnivå:

  • Public: synlig för världen och därför den minst restriktiva

  • Protected: synlig för paketet och alla dess underklasser

  • Paketskyddad: vanligtvis bara synlig för paketet de är i (standardinställningar)

  • privat: endast tillgängligt i det sammanhang där de definieras (inuti klassen Den ligger)

att sätta dessa distinkta begränsningar på plats gör utvecklingen mycket enklare. Du behöver inte oroa dig för någon oönskad synlighet för din implementering och mer, oönskade ändringar.

Placera ett lämpligt nyckelord framför den relaterade deklarationen:

om du försöker komma åt privata medlemmar utanför klassen får du fel:

kontrollnivåerna kan tilldelas klasselement såväl som klasser:

public class PublicClass {}private class PrivateClass {}

förutom säkerhet ger specificering av kontrollnivåer för klassmedlemmar bättre läsbarhet. När en utvecklare förbereder en källfil är det alltid klart vilka element som kan användas externt.

Kontrollhierarki

ett element kan ha samma eller mer restriktiva kontrollnivå än dess innehållande element:

i exemplet ovan deklareras klassen som public . Eftersom klassen är det innehållande elementet betyder det att alla element i den klassen kan ha samma eller mindre exponeringsnivå. I det här fallet inkluderar det alla nivåer.

om du deklarerar en klass som private kan dess element bara vara package-private eller 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() { }}

i exemplet ovan har vi lagt till en attribut utan ett uttryckligt nyckelordskontroll. I det här scenariot antar det som standard nivån på det innehållande elementet. I det här fallet är det vår klass, så det antar nivån på PrivateClass.

en toppklass kan inte markeras privat, men om du ställer in den som standard kommer den att placeras i den paketskyddade nivån. Om kontrollnivån för deklarationskontexten är högre än klassens, måste variabeln också ha en uttrycklig kontrollnivå när den deklarerar en variabel i en klass. Låt oss deklarera en fileprivateclass-variabel:

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

som du kan se, om standardåtkomstnivån för variabelns sammanhang är högre än en klass du tilldelar den, måste du uttryckligen ange variabelns nivå som samma eller lägre än den i klassen.

sammanfattning

i det här kapitlet har du lärt dig om variabel tillgänglighet:

  • en omfattning av en variabel är kodområdet där den har deklarerats.

  • allmänt variabelomfång gäller för alla kodblock, inklusive klasser.

  • ett annat nödvändigt sätt att kontrollera åtkomst till variabler och funktioner är att använda kontrollnivåer: offentliga, skyddade, paketskyddade och privata.

Lämna ett svar

Din e-postadress kommer inte publiceras.