Локални променливи

„Поздрави, любими мой ученик! Време е да се заемем малко по-сериозно с променливите. Но този път няма да обсъждаме тяхната вътрешна структура. Вместо това ще се съсредоточим върху това How променливите взаимодействат с codeа, където се намират.

„Всички променливи, които са декларирани вътре в методите, се наричат ​​локални променливи . Локална променлива съществува само в блока от code, в който е декларирана. Или, за да бъдем по-точни, тя съществува от момента, в който е декларирана до края на блока. на codeа, в който е деклариран."

— Ясно е, че имам нужда от пример.

„Няма проблем. Ето го:

Код Променлива наличност
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

„Нека да прегледаме правилата за достъп до локални променливи още веднъж. Ето блок от code. Какво бележи началото и края му?“

„Къдрави скоби?“

„Правилно. Това може да е тяло на метод, тяло на цикъл or просто блок от code за условен оператор. Променлива, декларирана в блок от code, съществува до края на този блок от code. Кажете ми къде ще променлива съществува, ако е декларирана в тялото на цикъл?"

„Ще съществува само в тялото на цикъла.“

„Точно така. Нещо повече, той ще се създава и унищожава при всяка итерация на цикъла.“

„Това означава, че не можете да декларирате две локални променливи с едно и също име в един метод — програмата няма да се компorра. Но можете да направите това, ако блоковете от code, където са декларирани променливите, не се припокриват.

„Има причина да си ми любим, Амиго. Вземи още един пример, за да затвърдиш това в мозъка си.

Код Променлива видимост
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

„Успяхме да декларираме втора локална променлива с име bсамо защото първата променлива не се вижда в codeовия блок, където е декларирана bвтората променлива.b

Параметри

„Както казахме преди, всеки метод може да има променливи, които наричаме параметри. Какво ще кажете за тяхната видимост и продължителност на живота?“

"Хмм... озадачен съм..."

"Тук всичко е доста просто. Параметрите се създават, когато изпълнението стъпи в метода (т.е. когато codeът на метода започне да се изпълнява). Те се елиминират, когато методът приключи."

„С други думи, те са видими в цялото тяло на метода и само там?“

„Да. Пример:

Код Променлива видимост
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

„Както казахме по-рано, argsе просто променлива, чийто тип е масив от низове. И като всички параметри, тя е налична навсякъде в тялото на метода. Въпреки това обикновено я игнорираме в нашите примери.

Променливи в клас

„Спомнете си уроците в ниво 1, където казахме, че един клас може да има методи и променливи. Методите понякога се наричат ​​методи на екземпляри, а променливите — променливи or полета на екземпляри.

„Какви са променливите (or полетата) на клас ?

Те са променливи, които са декларирани не в метод, а в клас."

— И за Howво са там?

"Като начало, те могат да бъдат достъпни от всеки (нестатичен) метод на клас. Грубо казано, променливите на екземпляра са променливи, които се споделят от всички методи на клас.

Пример:

Код Променлива видимост
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     count++;
   }

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum

„В този пример имаме два метода — add()и remove(). add()Методът увеличава променливите на екземпляра sumи count, а remove()методът намалява променливите на sumи count. И двата метода работят върху променливи на споделен екземпляр.“

"Разбирам всичко това! Локалните променливи съществуват, докато се изпълнява метод. Променливите на екземпляра на клас съществуват в обект на клас, докато този обект съществува."

„Браво, Амиго. Положихме някои основи и ще научите подробности за обектите от даден клас в следващото ниво.

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

„Подобно на методите, променливите в един клас могат да бъдат статични or нестатични. Статичните методи имат достъп само до статични променливи.

„Все още нямам ясно разбиране за статичните променливи.“

„О, знам, но не се притеснявайте. Засега просто се настанете удобно с тях. Запознайте се с тях. В ниво 11 ще анализираме структурата на статичните променливи и методи и ще разберете причините за тях ограничения.

„За да направите статична променлива (променлива на класа), трябва да напишете staticключовата дума в нейната декларация.

"Статичните променливи не са обвързани с обект or екземпляр от класа, в който са декларирани. Вместо това те принадлежат на самия клас. Ето защо те съществуват, дори ако не е създаден нито един обект от класа . Можете да се обърнете към ги от други класове, използвайки конструкция като:

ClassName.variableName

Пример:

Код Променлива видимост
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

"В горния пример създадохме отделен Storageклас, преместихме променливите countи sumв него и ги обявихме за статични . Публичните статични променливи могат да бъдат достъпни от всеки метод в програма (а не само от метод)."

— Не разбирам напълно, но това ми се струва удобно.

„Така е. И понякога е необходимо. Без статични променливи и методи щяхме да останем в застой.“

„Надявам се, че бавно ще мога да го разбера.“

— Да, разбира се, че ще го направиш.