Lær Programmering med Java

variabel scoping

hver variabel er kun tilgængelig (og tilgængelig) i den sammenhæng, inden for hvilken den er blevet erklæret. For at bestemme konteksten henvises til de nærmeste åbnings-og lukkemærker, der omgiver erklæringen. De fleste programmeringssprog bruger krøllede seler ({}) for at markere begyndelsen og slutningen af en blok kode. Tjek dette eksempel:

omfanget af en variabel

Der er ingen grund til at forstå hver bit kode her; bare fokusere på de krøllede seler. Når vi taler om tilgængeligheden af en variabel inden for en kontekst, henviser vi til omfang. Her kan du se, at variablen root er blevet erklæret mellem de to krøllede seler, der er cirklet i lilla. Omfanget af denne variabel er alt mellem disse to seler.

omfanget af en variabel kan være lokalt såvel som globalt, afhængigt af hvor en variabel er erklæret. En global variabel kan være tilgængelig for alle klasser og metoder inden for et program, mens en lokal variabel muligvis kun er tilgængelig inden for den metode, den er erklæret i:

Local vs global scope

Her, Vi har udvidet koden lidt og udvidet vores første kodeblok til at omfatte en anden! Hvis du sporer de lilla linjer, kan du se, at parenteserne fra den første blok omfatter hele koden fra den anden. Dernæst kan du se, at en ny variabel, spy, er blevet erklæret inden for det grønne lokale omfang.

da variablenroot er blevet erklæret i det globale omfang, betyder det, at det er tilgængeligt for alt inden for de lilla parenteser, inklusive alt, der er erklæret i det lokale omfang. I den anden blok af kode, kan du se en linje lige under spy variabel erklæring, som bruger root. Det er tilladt!

uanset hvad der er i det lokale omfang, er det dog ikke tilgængeligt for det globale omfang eller andre lokale kodeblokke. Lad os se på et andet eksempel:

Multiple scopes

Her har vi tilføjet en anden blok kode, som har sit eget lokale omfang og sin egen variabel, anotherSpy. Tjek nu den sidste linje i vores spy variabel blok:

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

ser ud som om der er en fejl! Det er fordi det forsøger at bruge anotherSpy variablen. Men det kan ikke fordi anotherSpy er hverken inden for det globale omfang eller i samme lokale omfang. Det betyder, at denne blok af kode ikke kan få adgang til den. anotherSpy er kun tilgængelig i den blok af kode, den er blevet erklæret i.

det samme gælder i den anden retning. Du kan se, at den sidste linje i vores sidste blok kode også har en fejl:

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

Her forsøger det at bruge variablen spy fra en anden blok kode. Men det kan ikke siden spy er ikke i samme omfang som kodeblokken, der forsøger at bruge den.

variabel rækkevidde i klasser

når du erklærer en klasse, gælder de samme generelle regler for scoping: hver variabel er kun tilgængelig inden for dens deklarationsblok. Lad os eksperimentere med en enhjørningsklasse:

Unicorn class

ligesom i vores første eksempel er der globale klassevariabler såvel som lokale. Lad os gennemgå i detaljer:

  • variablerneheight ogpower er felter i klassen og er tilgængelige overalt i klassen.

  • variablenminutesToSleep er kun tilgængelig inden for det lokale omfang af den kodeblok, den er erklæret i.

  • variablenminutesToRun er kun tilgængelig inden for det lokale omfang af den kodeblok, den er erklæret i.

omfanget af en variabel begrænser dens tilgængelighed pr. Klassefelter er dog tilgængelige uden for klassen og kan bruges af enhver anden kodeblok.

i vores eksempel er de heightog power. Hvis vi erklærer en Enhjørningsvariabel, kan vi læse eller ændre disse værdier:

at være i stand til at rode rundt med klassevariabler kan have alvorlige konsekvenser. Den gode nyhed er – du kan kontrollere det! Før vi tjekker hvordan, skal du sørge for at øve med variabel scoping.

prøv det selv!

adgangskontrol

Vi skal bruge ideen om adgangskontrol ved at implementere begrænset adgang til en klasse, et modul eller en fil. Du ved allerede, hvad en klasse og en fil er, da vi har arbejdet med dem!

et modul er et bundt af relaterede kildefiler, der er knyttet til et navn, som en ramme. En ramme er et sæt funktionaliteter grupperet efter en bestemt kontekst. Det fremskynder udviklingsprocessen og giver vejledning i, hvordan man skriver koden.

der er en række rammer, der leveres af hvert udviklingsmiljø. Faktum er, at implementeringen af disse rammer er langt ud over, hvad de udviklere, der bruger dem, kan se og udnytte. Det gøres ved at begrænse adgangen til detaljerne i implementeringen, også kendt som implementering af adgangskontrol.

kontrolniveauer

i Java skal du bruge et af nøgleordene til at udpege et kontrolniveau:

  • Offentlig: synlig for verden og derfor den mindst restriktive

  • beskyttet: synlig for pakken og alle dens underklasser

  • pakke-beskyttet: typisk kun synlig for den pakke, de er i (standardindstillinger)

  • privat: kun tilgængelig i den sammenhæng, hvori de er defineret (inde i klassen er den placeret)

at sætte disse forskellige begrænsninger på plads gør udviklingen meget lettere. Du behøver ikke bekymre dig om uønsket synlighed af din implementering og mere, uønskede ændringer.

Placer et passende nøgleord foran den relaterede erklæring:

Hvis du prøver at få adgang til private medlemmer uden for klassen, får du fejl:

kontrolniveauerne kan tildeles klasseelementer såvel som klasser:

public class PublicClass {}private class PrivateClass {}

ud over sikkerhed giver angivelse af kontrolniveauer for klassemedlemmer bedre læsbarhed. Når en udvikler klargør en kildefil, er det altid klart, hvilke elementer der kan bruges eksternt.

hierarki af kontrol

et element kan have det samme eller mere restriktive kontrolniveau end dets indeholdende element:

i eksemplet ovenfor erklæres klassen sompublic . Da klassen er det indeholdende element, betyder det, at alle elementer i denne klasse kan have samme eller mindre eksponeringsniveau. I dette tilfælde omfatter det alle niveauer.

Hvis du erklærer en klasse som private, kan dens elementer kun være 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 eksemplet ovenfor har vi tilføjet en attribut uden en eksplicit adgangskontrol søgeord. I dette scenario antager det som standard niveauet for det indeholdende element. I dette tilfælde er det vores klasse, så det antager niveauet af PrivateClass.

en klasse på øverste niveau kan ikke markeres privat, men hvis du indstiller den som standard, placeres den i det pakkebeskyttede niveau. Når der erklæres en variabel i en klasse, hvis kontrolniveauet for deklarationskonteksten er højere end klassens, skal variablen også have et eksplicit kontrolniveau. Lad os erklære en filprivateclass variabel:

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

som du kan se, hvis standardadgangsniveauet for variabelens kontekst er højere end en klasse, du tildeler den, skal du eksplicit angive variabelens niveau som det samme eller lavere end klassens.

Resume

i dette kapitel har du lært om variabel tilgængelighed:

  • et omfang af en variabel er det kodeområde, hvor det er blevet erklæret.

  • generelt variabelt omfang gælder for alle kodeblokke, inklusive klasser.

  • en anden nødvendig måde at kontrollere adgangen til variabler og funktioner på er at bruge kontrolniveauer: offentlig, beskyttet, pakkebeskyttet og privat.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.