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

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

Відкрита

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


7
Задача
Java Syntax Zero,  7 рівень5 лекція
Недоступна
Усе має коріння
Метод printSqrt(int[] array) має виводити квадратний корінь із кожного елемента масиву, переданого в метод. Однак цього не відбувається через конфлікт імен змінних. Виправ імена змінних так, щоб код компілювався. У результаті роботи програма має виводити в консоль відповідний рядок для кожного елеме

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


7
Задача
Java Syntax Zero,  7 рівень5 лекція
Недоступна
Міста-гіганти
Програма має виводити кількість населення найбільших міст світу й порівнювати його з найбільшим за чисельністю населення містом — Токіо. Але алгоритм програми трохи некоректний. Для виправлення помилки тобі потрібно зробити так, щоб у рядку з виведенням інформації про найбільше місто у світі викорис

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