CodeGym /Blog Java /Random-PL /Zakres Javy
Autor
Alex Vypirailenko
Java Developer at Toshiba Global Commerce Solutions

Zakres Javy

Opublikowano w grupie Random-PL
Wszyscy wiemy, że kraje mają granice i własne prawa. Prawa kraju działają w granicach. Również w kraju istnieją na przykład organizacje, takie jak szkoły czy muzea, które mają własne lokalne zasady. Nie stoją w sprzeczności z prawem danego kraju, lecz działają wyłącznie w ramach określonej organizacji. Tak samo jest w programowaniu. Tak więc w programowaniu, a zwłaszcza w języku Java, istnieje termin „zakres”. Odnosi się do obszarów programu, w których działają określone dane, takie jak zmienne lub metody. W tym artykule dowiemy się, jakie są zakresy zmiennych w Javie i jak je definiować.

Zakres Java w ogóle

Dlaczego konieczne jest oddzielenie zakresów zmiennych i metod? Faktem jest, że czasami programy są bardzo duże i śledzenie jednej lub drugiej zmiennej może być trudne. Ponadto w dużych projektach pożądane jest jasne nazewnictwo zmiennych, aby było jasne, do czego służą. Scope w szczególności pozwala na posiadanie różnych zmiennych o tej samej nazwie w różnych częściach programu. Taki kod jest łatwiejszy w utrzymaniu i czytaniu. Zasięg Java określa, gdzie w programie dostępna jest określona zmienna lub metoda. Krótko:
  • Zmienna zadeklarowana w metodzie jest widoczna od początku deklaracji do końca metody (zakres metody).
  • Zmienna zadeklarowana w bloku kodu istnieje do końca tego bloku kodu.
  • Zmienne będące argumentami metody istnieją do końca metody.
  • Zmienne klasy/obiektu istnieją przez cały okres istnienia obiektu zawierającego. Ich widoczność regulują specjalne modyfikatory dostępu.
  • Zmienne klasy statycznej istnieją przez cały czas działania programu. Ich widoczność jest również określana przez modyfikatory dostępu.

Zakres poziomu metody

Żadna zmienna zadeklarowana w metodzie, w tym argumenty, nie jest dostępna poza tą metodą. Wszystkie zmienne zadeklarowane wewnątrz metod są widoczne od początku ich deklaracji do końca metody. Oto przykład zakresu zmiennej metody:

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;
   }
}
Tutaj mamy secondArg , zmienną lokalną lub argument metody. Nie możemy użyć tej zmiennej poza metodą myMethod ani przed jej zadeklarowaniem. Jeśli zmienna jest argumentem funkcji, to jest widoczna w całym ciele tej metody. W powyższym przykładzie mamy dwa takie argumenty: arg w myMethod i args w main method.

Zakres poziomu klasy

Zakres na poziomie klasy (zmienne instancji) — każda zmienna zadeklarowana w klasie jest dostępna dla wszystkich metod tej klasy. W zależności od modyfikatora dostępu (tj. publicznego lub prywatnego), czasami można uzyskać do niego dostęp poza klasą. Więc jeśli zmienna jest zmienną klasową, to jest powiązana z określonym obiektem i istnieje tak długo, jak istnieje obiekt tej klasy. Jeśli nie ma obiektu, oznacza to, że nie ma kopii zmiennej. Zmienna jest widoczna ze wszystkich metod klasy, niezależnie od tego, czy zostały zadeklarowane przed nią, czy po niej. Każdy obiekt ma swoją własną zmienną niezależną od innych obiektów. Dostęp do zmiennej z metod statycznych nie jest możliwy.

Przykład kodu


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));
   }
}
Nazwisko , imię , drugie imię i urodziny to zmienne instancji.

Zakres bloku

Jeśli zmienna jest zdefiniowana/zadeklarowana w jakimś bloku kodu, to istnieje do końca tego bloku kodu. Zazwyczaj takie zmienne istnieją między nawiasami klamrowymi, w których są zdefiniowane. Bardzo często zakres blokowy może być zmienną pętli. Zmienna zadeklarowana w warunku pętli for nie jest dostępna poza pętlą, chyba że została wcześniej zdefiniowana.

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);
   }
}
Obie zmienne sum i i są zadeklarowane wewnątrz pętli i nie istnieją poza tą pętlą. Jednak druga suma została zadeklarowana poza pętlą, więc ta konkretna zmienna zostanie wydrukowana.

Zmienne statyczne

Jeśli zmienna jest zadeklarowana jako statyczna (oznaczona słowem kluczowym static), to istnieje tak długo, jak długo istnieje jej klasa. Zazwyczaj JVM ładuje klasę do pamięci przy pierwszym użyciu, gdy inicjowane są zmienne statyczne.

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);
   }

}
Nie powinieneś tworzyć nowej instancji klasy Student , aby użyć statycznej zmiennej dzisiaj . Tutaj zostanie wydrukowany „2022”.

Modyfikatory dostępu

Java ma 4 modyfikatory dostępu, aby ograniczyć dostęp do metody lub zmiennej. Możesz ich używać wewnątrz klas, a nie wewnątrz metod.
  • private jest najbardziej restrykcyjnym modyfikatorem. Ogranicza dostęp do metod i zmiennych do klasy, do której zostały zadeklarowane. Jeśli nie ma potrzeby używania pewnych metod lub zmiennych poza klasą, użyj private. Zmienne klasy są zwykle prywatne w Javie.

  • Jeśli nie określono modyfikatora dostępu, metoda lub zmienna zaakceptuje domyślny modyfikator. default zezwala na dostęp tylko z bieżącego pakietu.

  • protected modyfikator umożliwia dostęp do metody lub zmiennej tylko z poziomu bieżącego pakietu, chyba że jest dostępny za pośrednictwem klasy potomnej spoza pakietu.

  • public jest najmniej restrykcyjnym modyfikatorem. Pozwala na dostęp do klasy, metody czy zmiennej nie tylko z poziomu klasy, w której zostały zadeklarowane, ale także z zewnątrz. Ten modyfikator jest używany bardzo często.

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