CodeGym /Java blog /Tilfældig /Java omfang
John Squirrels
Niveau
San Francisco

Java omfang

Udgivet i gruppen
Vi ved alle, at lande har grænser og deres egne love. Landets love fungerer inden for grænserne. Også i landet er der for eksempel organisationer, såsom skoler eller museer, som har deres egne lokale regler. De er ikke i modstrid med landets love, men opererer kun inden for rammerne af den specificerede organisation. Det samme gælder i programmering. Så i programmering, og især i Java-sprog, er der et udtryk "omfang". Det refererer til områder af programmet, hvor visse data, såsom variabler eller metoder, fungerer. I denne artikel skal vi finde ud af, hvilke omfang der er for variabler i Java, og hvordan man definerer dem.

Java Scope generelt

Hvorfor er det nødvendigt at adskille omfanget af variabler og metoder? Faktum er, at nogle gange er programmer meget store, og det kan være svært at spore en eller anden variabel. Derudover er det i store projekter ønskeligt med tydelig navngivning af variabler, så det er tydeligt, hvad de er til for. Scope giver dig specifikt mulighed for at have forskellige variabler med samme navn i forskellige dele af programmet. En sådan kode er lettere at vedligeholde og læse. Java-omfang definerer, hvor en bestemt variabel eller metode er tilgængelig i et program. Kort:
  • En variabel deklareret i en metode er synlig fra begyndelsen af ​​deklarationen til slutningen af ​​metoden (metodeomfang).
  • En variabel erklæret i en kodeblok eksisterer indtil slutningen af ​​denne kodeblok.
  • Variabler, der er metodeargumenter, eksisterer indtil slutningen af ​​metoden.
  • Klasse-/objektvariabler eksisterer i det indeholdte objekts levetid. Deres synlighed er reguleret af særlige adgangsmodifikatorer.
  • Statiske klassevariable eksisterer, hele tiden programmet kører. Deres synlighed bestemmes også af adgangsmodifikatorer.

Metodeniveau Omfang

Enhver variabel erklæret i en metode, inklusive argumenter, er ikke tilgængelig uden for denne metode. Alle variabler erklæret inde i metoder er synlige fra begyndelsen af ​​deres erklæring til slutningen af ​​metoden. Her er et eksempel på metodevariabelt omfang:

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 bruge denne variabel uden for myMethod- metoden eller før den blev erklæret. Hvis en variabel er et funktionsargument, er den synlig i hele denne metodes brødtekst. I eksemplet ovenfor har vi to sådanne argumenter: arg i myMethod og args i hovedmetoden.

Omfang på klasseniveau

Klasseniveauomfang (instansvariabler) — enhver variabel, der er erklæret i en klasse, er tilgængelig for alle metoder i den pågældende klasse. Afhængigt af dens adgangsmodifikator (dvs. offentlig eller privat), kan den nogle gange tilgås uden for klassen. Så hvis en variabel er en klassevariabel, så er den bundet til et specifikt objekt og eksisterer så længe der er et objekt af denne klasse. Hvis der ikke er noget objekt, er der ingen kopi af variablen. Variablen er synlig fra alle metoder i klassen, uanset om de er erklæret før eller efter den. Hvert objekt har sin egen variabel uafhængig af andre objekter. Adgang 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));
   }
}
Efternavn , navn , andetnavn og fødselsdag er Instance-variabler.

Blok omfang

Hvis en variabel er defineret/erklæret i en kodeblok, eksisterer den indtil slutningen af ​​den kodeblok. Typisk eksisterer sådanne variable mellem de krøllede seler, hvori de er defineret. Meget ofte kunne blokomfang være en loop-variabel. En variabel, der er erklæret i en for- løkke-tilstand, er ikke tilgængelig uden for løkken, medmindre du har defineret 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 variable er erklæret inde i løkken og eksisterer ikke uden for denne løkke. Den anden sum blev dog erklæret uden for løkken, så denne særlige variabel vil blive udskrevet.

Statiske variable

Hvis en variabel er erklæret som statisk (markeret med det statiske nøgleord), så eksisterer den så længe dens klasse eksisterer. Typisk indlæser JVM en klasse i hukommelsen ved første brug, når statiske variable 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 oprette en ny forekomst af Elev- klassen for at bruge variabelen static today . Her vil "2022" blive trykt.

Adgangsmodifikatorer

Java har 4 adgangsmodifikatorer for at begrænse adgangen til metoden eller variablen. Du kan bruge dem i klasser, ikke inde i metoder.
  • privat er den mest restriktive modifikator. Det begrænser adgangen til metoder og variabler til den klasse, de blev erklæret. Hvis der ikke er behov for at bruge bestemte metoder eller variabler uden for klassen, skal du bruge private. Klassevariabler er normalt private i Java.

  • Hvis der ikke er angivet nogen adgangsmodifikator, vil metoden eller variablen acceptere standardmodifikatoren . standard tillader kun adgang fra den aktuelle pakke.

  • beskyttet modifikator tillader kun adgang til en metode eller variabel fra den aktuelle pakke, medmindre den tilgås via en underordnet klasse uden for pakken.

  • public er den mindst restriktive modifikator. Det giver dig mulighed for at få adgang til en klasse, metode eller variabel ikke kun fra den klasse, de er erklæret, men også udefra. Denne modifikator bruges virkelig ofte.

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