JavaRush /Курси /Java Syntax Zero /Видимість змінних

Видимість змінних

Java Syntax Zero
Рівень 7 , Лекція 5
Відкрита

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



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



Коментарі (12)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Stas Semenyuk_ЗСУ Рівень 18
11 лютого 2025
Перша задача взагалі не варта уваги. Різні типи з однаковими іменами. А друга задача збила назвою класу. Кругом той Solution мелькає, не повірив, що до змінної рівня класу саме через Solution треба звернутись. Але, у матеріалі лекції про все сказано. Було цікаво
Alex Рівень 2
18 серпня 2024
я не викупив, але перечитав інші джерела і ось що зрозумів: статична змінна класу - доступна для всіх, вона як дошка в школі, кожен учень (клас) може щось написати, і решта будуть бачити результат нестатична змінна класу - тобто та, яка просто оголошена з модифікатором доступу та назвою (типу public int), це як оцінка кожного окремого студента. Вона доступна тільки тоді, коли ми створимо екземпляр цього класу, звернемось до цієї змінної та щось там збережемо, наприклад: створимо нового студента, звернемось до нестатичної змінної "оцінка" класу "оцінки" і запишемо туди оцінку. Якщо ми створимо більше одного студента і позаписуємо туди оцінки, то отримати данні про ці оцінки ми зможемо тільки якщо буде напряму звертатись до студента, ніхто інший в класі не буде бачити оцінки інших
ivan Рівень 10
19 липня 2024
Поки що я дубовий по цій темі 😟
Artemiy Рівень 18
7 червня 2024
Я в другому завданні нічого міняти не треба
Олександр Рівень 18
4 листопада 2023
Так прикро коли в одному місці виправив, а про друге забув, і все, дві спроби)))
Nicky^^ Рівень 32
27 січня 2023
А людей все менше і менше хпхп.
Andrew Рівень 8
27 листопада 2022
Щось ви з населенням міст загнули)
Roma Chernesh Рівень 16
17 грудня 2022
Якщо враховувати всі агломерації (передмістя міст) Токіо - 38 млн Джакарта - 32 млн. Сеул - 24 млн. Делі - 27 млн. Нью-Йорк - 21 млн.
Yevhenii Рівень 17
3 січня 2023
Спочатку теж так подумав, але потім ще раз перечитав лекцію і наткнувся на такий вираз "ClassName.variableName".
Саша Рівень 30
27 вересня 2022
поясніть перше завдання, бо не бачу там проблеми
Olesia Рівень 28
27 вересня 2022
Зверни увагу на те, що код не компілюється через однакові імена змінних різного типу
Me Lex Рівень 12
15 березня 2022
Прям зовсім трошки , проте більш зрозуміліше стає ...