CodeGym /Java-blogg /Tilfeldig /Java-omfang
John Squirrels
Nivå
San Francisco

Java-omfang

Publisert i gruppen
Vi vet alle at land har grenser og egne lover. Lovene i landet opererer innenfor grensene. Også i landet finnes det for eksempel organisasjoner, som skoler eller museer, som har egne lokale regler. De er ikke i strid med landets lover, men opererer kun innenfor rammen av den angitte organisasjonen. Det samme gjelder i programmering. Så i programmering, og spesielt i Java-språk, er det et begrep "omfang". Det refererer til områder av programmet der visse data, for eksempel variabler eller metoder, fungerer. I denne artikkelen skal vi finne ut hvilke omfang som er for variabler i Java og hvordan de skal defineres.

Java Scope generelt

Hvorfor er det nødvendig å skille omfang av variabler og metoder? Faktum er at noen ganger er programmer veldig store og det kan være vanskelig å spore en eller annen variabel. I tillegg er det i store prosjekter ønskelig med tydelig navngiving av variabler slik at det er tydelig hva de er til for. Scope lar deg spesifikt ha forskjellige variabler med samme navn i forskjellige deler av programmet. Slik kode er lettere å vedlikeholde og lese. Java-omfang definerer hvor en bestemt variabel eller metode er tilgjengelig i et program. Kort:
  • En variabel deklarert i en metode er synlig fra begynnelsen av deklarasjonen til slutten av metoden (metodeomfang).
  • En variabel deklarert i en kodeblokk eksisterer til slutten av den kodeblokken.
  • Variabler som er metodeargumenter eksisterer til slutten av metoden.
  • Klasse-/objektvariabler eksisterer i hele levetiden til objektet som inneholder. Deres synlighet er regulert av spesielle tilgangsmodifikatorer.
  • Statiske klassevariabler eksisterer hele tiden programmet kjører. Synligheten deres bestemmes også av tilgangsmodifikatorer.

Metodenivå Omfang

Enhver variabel deklarert i en metode, inkludert argumenter, er ikke tilgjengelig utenfor denne metoden. Alle variabler deklarert i metoder er synlige fra begynnelsen av deklarasjonen til slutten av metoden. Her er et eksempel på metodevariabelomfang:

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
Her har vi secondArg , en lokal variabel eller metodeargument. Vi kan ikke bruke denne variabelen utenfor myMethod- metoden eller før den ble deklarert. Hvis en variabel er et funksjonsargument, er den synlig i hele kroppen til denne metoden. I eksemplet ovenfor har vi to slike argumenter: arg i myMethod og args i hovedmetoden.

Omfang på klassenivå

Klassenivåomfang (forekomstvariabler) — enhver variabel deklarert i en klasse er tilgjengelig for alle metodene i den klassen. Avhengig av tilgangsmodifikatoren (dvs. offentlig eller privat), kan den noen ganger få tilgang utenfor klassen. Så hvis en variabel er en klassevariabel, er den bundet til et spesifikt objekt og eksisterer så lenge det er et objekt av denne klassen. Hvis det ikke er noe objekt, er det ingen kopi av variabelen. Variabelen er synlig fra alle metoder i klassen, uavhengig av om de er deklarert før eller etter den. Hvert objekt har sin egen variabel uavhengig av andre objekter. Tilgang til en variabel fra statiske metoder er ikke mulig.

Kode eksempel


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
Etternavn , navn , andrenavn og fødselsdag er forekomstvariabler.

Block Scope

Hvis en variabel er definert/erklært i en kodeblokk, eksisterer den til slutten av den kodeblokken. Vanligvis eksisterer slike variabler mellom de krøllete tannreguleringene der de er definert. Svært ofte kan blokkomfang være en sløyfevariabel. En variabel som er deklarert i en for loop-tilstand er ikke tilgjengelig utenfor loopen, med mindre du har definert den på forhånd.

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
Både første sum- og i-variabler er deklarert inne i løkken og eksisterer ikke utenfor denne løkken. Imidlertid ble den andre summen erklært utenfor loopen, så denne spesielle variabelen kommer til å bli skrevet ut.

Statiske variabler

Hvis en variabel er erklært som statisk (merket med det statiske nøkkelordet), så eksisterer den så lenge dens klasse eksisterer. Vanligvis laster JVM en klasse inn i minnet ved første gangs bruk, når statiske variabler initialiseres.

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
Du bør ikke opprette en ny forekomst av Student- klassen for å bruke variabelen static today . Her vil "2022" bli trykt.

Tilgangsmodifikatorer

Java har 4 tilgangsmodifikatorer for å begrense tilgangen til metoden eller variabelen. Du kan bruke dem i klasser, ikke i metoder.
  • privat er den mest restriktive modifikatoren. Det begrenser tilgangen til metoder og variabler til klassen de ble erklært. Hvis det ikke er behov for å bruke visse metoder eller variabler utenfor klassen, bruk private. Klassevariabler er vanligvis private i Java.

  • Hvis ingen tilgangsmodifikator er spesifisert, vil metoden eller variabelen godta standardmodifikatoren . standard tillater tilgang bare fra gjeldende pakke.

  • beskyttet modifikator tillater tilgang til en metode eller variabel bare fra den gjeldende pakken, med mindre den er tilgjengelig gjennom en barneklasse utenfor pakken.

  • offentlig er den minst restriktive modifikatoren. Den lar deg få tilgang til en klasse, metode eller variabel ikke bare fra klassen de er deklarert, men også fra utsiden. Denne modifikatoren brukes veldig ofte.

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION