„Професорът просто не може да излезе от коловоза си. Старите учители, които са свикнали да изнасят лекции, винаги са такива. Няма нищо, което да ви каже, което да не можете да намерите в книгите. Не се научавате да плувате, като слушате на лекции по плуване. Лекциите са полезни само когато сте запознат с предмета и знаете почти толкова, колкото вашият професор."

— Все пак уроците му са полезни.

„Да. Искам да кажа, надяваме се, че са. Колкото повече гледни точки по темата чуете, толкова по-близо ще стигнете до истината. Когато чуете само една, всичко, което можете да направите, е да повярвате or да не повярвате. Добре, нека върнете се към бизнеса."

— Нека да разгледаме една снимка, която ви показах преди.


public class Variables

{
   private static String TEXT = "The end.";
  ┗━━━━━━━━━━━━━━━━━━━┛
   public static void main (String[] args)
                          ┗━━━━━━━┛
  {
     System.out.println("Hi");
     String s = "Hi!";
   ┏┗━━━━┛
    System.out.println(s);
    if (args != NULL)
    {
       String s2 = s;
      ┗━━━━┛
   
      System.out.println(s2);
     
    }
    Variables variables = new Variables();
    System.out.println(variables.instanceVariable);
    System.out.println(TEXT);
   
  }
 
   public String instanceVariable;
  ┗━━━━━━━━━━━━━━━┛
   public Variables()
   {
      instanceVariable = "Instance variable test.";
   }
}

1. Променлива, декларирана в метод, съществува (е видима) от началото на нейната декларация до края на метода.

2. Променлива, декларирана в codeов блок, съществува до края на codeовия блок.

3. Параметрите на метода съществуват, докато методът не се върне.

4. Променливите в даден обект съществуват през целия живот на обекта, който ги съдържа. Тяхната видимост също се управлява от специални модификатори за достъп.

5. Статичните (класови) променливи съществуват през цялото време, докато програмата работи. Тяхната видимост също се определя от модификаторите за достъп."

"Точно. Спомням си тази снимка."

„Страхотно. Нека ви напомня за някои ключови точки.“

„Всички променливи, декларирани вътре в методите, съществуват (са видими) от точката, в която са декларирани до края на метода (Пример 1).“

„Ако променлива е декларирана в codeов блок, тя съществува до края на codeовия блок (Пример 2).“

„Ако дадена променлива е параметър на метод, тя съществува (е видима) в цялото тяло на метода (Пример 3).“

"Ако една променлива е екземплярна променлива (Пример 4), тя е свързана с определен обект и съществува, докато обектът съществува. Ако не съществува обект, тогава няма екземпляри на променливата. Можете да получите достъп до променливата (т.е. променливата е видима) от всички методи на класа, независимо дали са декларирани преди or след него. За всеки обект се създава нова променлива. Тя е независима от други обекти. Не можете да получите достъп до променлива на екземпляр от статични методи .

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

Повече за обхвата на променливите - 1

"Примерът по-горе декларира класа Cat, който има четири променливи: a, b, s (нестатични променливи) и count (статична променлива). Ако създадем няколко обекта от този клас (да кажем три), всеки от те ще съдържат свои собствени екземпляри на нестатичните променливи на класа. Статичната променлива се споделя от всички обекти на класа. Технически казано, тя дори не е вътре в тези обекти, тъй като е съществувала още преди да бъдат създадени обекти на Cat."

„Ето Howво се случва, ако декларираме променлива sstatic:“

Повече за обхвата на променливите - 2

"ОК. Мисля, че разбирам."

„Можете ли да декларирате променливи с едно и също име?“

"Не в метод. Всички променливи, декларирани в метод, трябва да имат уникални имена. Аргументите на метода също се считат за локални променливи."

„Ами членските променливи?“

„Променливите-членове също трябва да бъдат уникални за всеки клас.“

„Но има изключение: имената на локалните променливи и променливите членове могат да бъдат идентични.

„Ако променим такава променлива, коя от двете променливи с еднакви имена ще бъде променена?“

„Ако има няколко видими (достъпни) променливи в нашия code – да речем, променлива на екземпляр и локална променлива – локалната променлива ще бъде достъпна.“

Пример с две променливи за броене
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"Този code декларира две променливи за броене. Ред 3 декларира променлива на екземпляр , а ред 8 – локална променлива ."

„Ето Howво се случва, когато се изпълни методът run:“

„В ред 7 получаваме достъп до променливата на екземпляра и й присвояваме стойност 15“

"В ред 8 ние декларираме (създаваме) нова локална променлива : count. Тя маскира променливата на екземпляра. Локалната променлива е това, което целият последващ code в метода ще види (достъп)."

"Схванах го."

„Локалната променлива маскира променливата на екземпляра. С други думи, локалната променлива е тази, до която трябва да получите достъп. Вие обаче можете да получите достъп и до променливата на екземпляра. Просто е малко по-сложно да го направите.“

Статична (класова) променлива
ClassName.variableName

// Here are some examples:
Cat.catsCount
Нестатична (екземплярна) променлива
this.variableName

// Here are some examples:
this.catsCount

„Какво друго можете да ми кажете за статичните методи и статичните променливи?“

"Статичните методи и променливи не са свързани с обекти на класа; те са свързани със самия клас. Ако създадем десет обекта Variables (вижте примера в началото на това ниво), ще имаме десет променливи instanceVariable (по една за всяка обект) и само една споделена (статична) променлива TEXT ."

"Имам въпрос."

„Каква е разликата между статичните и нестатичните методи?“

„Нека да разгледаме How работи един нестатичен метод:“

Как изглежда codeът
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Какво наистина се случва
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

„Когато извиквате метод с помощта на <обект> точка <име на метод> , вие всъщност извиквате метод на клас и предавате същия обект като първи аргумент. Вътре в метода обектът се нарича „това“ . Всички операции в се изпълняват върху този обект и неговите данни."

„Уау! Значи така работи всичко!“

„И така работи един статичен метод.“

Как изглежда codeът
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Какво наистина се случва
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

„Когато извикате статичен метод, към него не се предава обект. С други думи, „това“ е равно на null . Ето защо статичен метод няма достъп до нестатични променливи и методи (тъй като няма „това“ за предаване към тези методи)."

„Хммм. Мисля, че го разбирам. Поне малко.“

"И ето го чичо Диего... и неговите задачи."