CodeGym /Java блог /Случаен /Обхват на Java
John Squirrels
Ниво
San Francisco

Обхват на Java

Публикувано в групата
Всички знаем, че държавите имат граници и собствени закони. Законите на страната действат в границите. Също така в страната има например организации, като учorща or музеи, които имат свои местни правила. Те не противоречат на законите на страната, а действат само в рамките на определената организация. Същото е и в програмирането. Така че в програмирането, и по-специално в езика Java, има термин "обхват". Отнася се за области на програмата, където работят определени данни, като променливи or методи. В тази статия ще разберем Howви са обхватите за променливи в Java и How да ги дефинираме.

Java Scope като цяло

Защо е необходимо да се разделят обхватите на променливите и методите? Факт е, че понякога програмите са много големи и може да бъде трудно да се проследи една or друга променлива. Освен това, в големи проекти е желателно ясно именуване на променливите, така че да е ясно за Howво служат. Обхватът специално ви позволява да имате различни променливи с едно и също име в различни части на програмата. Такъв code е по-лесен за поддръжка и четене. Обхватът на Java определя къде определена променлива or метод е достъпна в програмата. Накратко:
  • Променлива, декларирана в метод, се вижда от началото на декларацията до края на метода (обхват на метода).
  • Променлива, декларирана в codeов блок, съществува до края на този codeов блок.
  • Променливите, които са аргументи на метода, съществуват до края на метода.
  • Променливите клас/обект съществуват през целия живот на съдържащия се обект. Тяхната видимост се регулира от специални модификатори за достъп.
  • Статичните променливи на класа съществуват през цялото време, когато програмата работи. Тяхната видимост също се определя от модификаторите за достъп.

Обхват на нивото на метода

Всяка променлива, декларирана в метод, включително аргументи, не е достъпна извън този метод. Всички променливи, декларирани в методите, са видими от началото на тяхната декларация до края на метода. Ето пример за обхват на променливата на метода:

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;
   }
}
Тук имаме secondArg , локална променлива or аргумент на метод. Не можем да използваме тази променлива извън метода myMethod or преди да е била декларирана. Ако дадена променлива е аргумент на функция, тогава тя е видима в цялото тяло на този метод. В примера по-горе имаме два такива аргумента: arg в myMethod и args в основния метод.

Обхват на ниво клас

Обхват на ниво клас (Променливи на екземпляри) — всяка променлива, декларирана в клас, е достъпна за всички методи на този клас. В зависимост от неговия модификатор за достъп (т.е. публичен or частен), понякога може да бъде достъпен извън класа. Така че, ако една променлива е променлива от клас, тогава тя е обвързана с конкретен обект и съществува, докато има обект от този клас. Ако няма обект, значи няма копие на променливата. Променливата е видима от всички методи на класа, независимо дали са декларирани преди or след нея. Всеки обект има своя собствена променлива, независима от други обекти. Достъпът до променлива от статични методи не е възможен.

Примерен code


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));
   }
}
Surname , име , второ име и рожден ден са променливи на екземпляр.

Обхват на блока

Ако една променлива е дефинирана/декларирана в няHowъв блок от code, тогава тя съществува до края на този блок от code. Обикновено такива променливи съществуват между фигурните скоби, в които са дефинирани. Много често блоковият обхват може да бъде променлива на цикъл. Променлива, която е декларирана в condition за цикъл for , не е достъпна извън цикъла, освен ако не сте я дефинирали предварително.

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);
   }
}
Променливите първа sum и i са декларирани вътре в цикъла и не съществуват извън този цикъл. Втората сума обаче беше декларирана извън цикъла, така че тази конкретна променлива ще бъде отпечатана.

Статични променливи

Ако една променлива е декларирана като статична (маркирана с ключовата дума static), тогава тя съществува, докато съществува нейният клас. Обикновено JVM зарежда клас в паметта при първа употреба, когато статичните променливи се инициализират.

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

}
Не трябва да създавате нов екземпляр на клас Student , за да използвате статичната днес променлива. Тук ще бъде отпечатано „2022“.

Модификатори за достъп

Java има 4 модификатора за достъп за ограничаване на достъпа до метода or променливата. Можете да ги използвате вътре в класовете, а не в методите.
  • private е най-рестриктивният модификатор. Той ограничава достъпа до методи и променливи до класа, в който са декларирани. Ако няма нужда да използвате определени методи or променливи извън класа, използвайте private. Променливите на класа обикновено са частни в Java.

  • Ако не е указан модификатор за достъп, методът or променливата ще приеме модификатора по подразбиране . по подразбиране позволява достъп само от текущия пакет.

  • protected модификатор позволява достъп до метод or променлива само от текущия пакет, освен ако не е достъпен чрез дъщерен клас извън пакета.

  • public е най-малко ограничаващият модификатор. Тя ви позволява да получите достъп до клас, метод or променлива не само от класа, в който са декларирани, но и отвън. Този модификатор се използва много често.

Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION