1. Локальні змінні

Поговорімо трохи серйозніше про змінні. Натомість цього разу розгляньмо не їхню внутрішню будову, а взаємодію змінних із кодом, в якому вони знаходяться.

Усі змінні, оголошені всередині методів, називають локальними змінними. Локальна змінна існує тільки в тому блоці коду, в якому її оголошено. Точніше, вона існує з моменту оголошення й до кінця блока коду, в якому її оголошено.

Для простоти розгляньмо приклад:

Код Доступність змінних
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

Обговорімо доступність локальних змінних іще раз. Є блок коду, обмежений фігурними дужками: це може бути тіло методу, тіло циклу або просто блок коду умовного оператора. Змінна, оголошена у блоці коду, існує до кінця цього блока коду.

Якщо змінну оголосити в тілі циклу, вона існуватиме лише в тілі циклу, створюючись і знищуючись на кожному витку циклу.

Неможливо оголосити дві локальні змінні з однаковими іменами в одному методі — програма не скомпілюється. Але можна це зробити, якщо блоки коду, в яких оголошено змінні, не перетинаються.

Приклад:

Код Доступність змінних
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 ми змогли оголосити лише тому, що першу змінну b не видно в блоці коду, де оголошено другу змінну b.


2. Змінні-параметри

Як ми вже казали раніше, у кожного методу можуть бути змінні-параметри. А що можна сказати про їх видимість і час життя?

Тут усе досить просто. Змінні-параметри створюються, коли керування передається в код методу (код методу починає виконуватися), і видаляються, коли робота методу завершується. Їх видно в усьому тілі методу.

Приклад:

Код Доступність змінних
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 — це просто змінна типу масив рядків. І подібно до всіх змінних-параметрів вона доступна всюди всередині тіла методу. Хоча в наших прикладах ми її зазвичай ігноруємо.


9
Задача
Java Syntax Zero,  9 рівень4 лекція
Недоступна
Зворотний відлік
У класі Solution у методі countDown() ведеться зворотний відлік. Ти маєш зробити так, щоб рядки тексту виводилися в консоль з інтервалом 1 секунда. У цьому тобі допоможе метод sleep(long) класу Thread.

3. Змінні класу

Як ви пам'ятаєте з лекцій 1-го рівня, клас може містити функції та змінні. Функції при цьому прийнято називати «методами класу», а змінні — «змінними класу» або «полями класу». На практиці в межах Java це синоніми.

Що ж таке змінні (або поля) класу?

Змінні класу — це змінні, оголошені не в методі, а в класі.

До них можна звертатися з будь-якого методу класу. У загальних рисах, змінні класу — це спільні змінні для всіх методів класу.

Приклад:

Код Доступність змінних
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. Обидва методи працюють зі спільними змінними класу.

Локальні змінні існують, поки виконується метод. А змінні класу існують стільки часу, скільки існує об'єкт класу, до якого вони належать. Детальніше про об'єкти класу ви дізнаєтеся на наступному рівні.


4. Статичні змінні

Змінні класу, як і методи класу, бувають статичними й нестатичними (звичайними). Статичні методи можуть звертатися лише до статичних змінних.

На 11-му рівні ми розглянемо будову статичних змінних і методів і зрозуміємо причини таких обмежень.

Щоб зробити змінну класу статичною, потрібно перед її оголошенням написати ключове слово static.

Статичні змінні прив'язані не до об'єкта класу, в якому їх оголошено, а власне до класу. Тому вони існують, навіть якщо не створено жодного об'єкта типу класу. Звертатися до них із інших класів можна за допомогою такої конструкції:

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 і оголосили їх статичними. До публічних статичних змінних можна звертатися з будь-якого методу програми (та й не тільки з методу).


9
Задача
Java Syntax Zero,  9 рівень4 лекція
Недоступна
Counter
У класі Solution реалізуй метод printNumbers(), який виводить числа від 1 до 10 включно з інтервалом 1,3 мілісекунди між виведенням кожного числа. У цьому тобі допоможе метод sleep(long, int) класу Thread.