1. Константи
У багатьох мовах програмування є константи — змінні, значення яких змінювати не можна. Зазвичай це якісь фундаментальні речі на кшталт числа Pi
або кількості днів у місяцях. Хоча в принципі програміст може зробити будь-яку змінну константою, якщо вважатиме це за потрібне.
Отже, як оголосити незмінювану змінну (константу) в Java? Для цього є спеціальне ключове слово — final
. Створення незмінюваної змінної має такий самий вигляд, як і створення звичайної, тільки перед типом змінної слід написати слово final
:
final тип ім'я = значення;
Якщо ви спробуєте присвоїти final
-змінній інше значення, ваша програма просто не скомпілюється.
final
-змінну обов'язково треба ініціалізувати (присвоїти їй значення) під час оголошення. Це правило має один виняток: можна перенести ініціалізацію змінної класу в конструктор. Однак про це ви дізнаєтеся на 10-му рівні.
Щоб зменшити кількість ключових слів, розробники Java використовують слово final
не тільки для оголошення констант. Метод і навіть клас теж можуть бути final
. Методи, оголошені як final
, не можна перевизначати (override), а клас, оголошений як final
, не може бути базовим класом для успадкування.
Модифікатор final
можна вказувати перед будь-якими змінними: локальними, параметрами, полями класу і статичними змінними.
Зверніть увагу, що final
— це лише захист від змінення змінної. Якщо змінна зберігає посилання на об'єкт, то об'єкт все ж таки міняти можна.
Приклад:
|
Створюємо масив. Так не можна: змінну data оголошено як final .А так можна. І так можна. |
Глобальні константи
Якщо ви захочете оголосити у своїй програмі глобальні константи, вам потрібно створити статичні змінні класу, а також визначити їх як public
і final
. Для імен таких змінних існує спеціальний стиль написання: їх пишуть великими літерами, а як роздільник слів використовують знак підкреслення.
Приклади:
class Solution
{
public static final String SOURCE_ROOT = "c:\\projects\\my\\";
public static final int DISPLAY_WIDTH = 1024;
public static final int DISPLAY_HEIGHT = 768;
}
2. Затінення змінних
Як ми вже казали, не можна в одному методі створити кілька локальних змінних з однаковими іменами. У різних методах — можна.
А цього ви, напевно, не знаєте: змінним класу і локальним змінним методу дозволено мати однакові імена.
Приклад:
Код | Доступність змінних |
---|---|
|
|
У методі add
ми оголосили локальну змінну sum
, і вона до кінця дії методу перекриває (або ще кажуть затіняє) собою змінну класу sum
.
Ну гаразд, скажете ви, навіть в якомусь сенсі очікувана поведінка. Але це ще не все. Виявляється, якщо змінну класу затіняє локальна змінна, у методі все-таки є спосіб звернутися до змінної класу. Для цього потрібно перед її іменем написати ключове слово this
:
this.ім'я
Ось приклад, в якому конфлікт імен успішно вирішується:
Код | Доступність змінних |
---|---|
|
|
Змінні count
і sum
доступні всюди як із ключовим словом this
, так і без нього. У тих рядках, де локальна змінна sum
затіняє змінну класу sum
, доступ до змінної класу sum
можливий тільки за умови застосування this
.
Якщо затіняється не просто змінна класу, а статична змінна класу, звертатися до неї потрібно не через this
, а через ім'я класу:
ClassName.ім'я
Приклад:
Код | Доступність змінних |
---|---|
|
|
Статичні змінні count
і sum
доступні всюди як із префіксом у вигляді імені класу Solution
, так и без нього. У тих рядках, де локальна змінна sum
затіняє змінну класу sum
, доступ до змінної класу sum
можливий тільки за умови застосування префікса Solution
.
3. Змінні всередині циклу for
І ще один маленький, але цікавий факт.
Є ще одне місце, де в особливий спосіб оголошується змінна — це цикл for
.
Якщо ви пам'ятаєте, зазвичай у циклі for
в круглих дужках оголошується змінна-лічильник. І яка ж буде область видимості цієї змінної? Адже вона не міститься в тілі циклу — значить, її буде видно по всьому методу? Чи все-таки ні?
Правильна відповідь така: змінну, оголошену в заголовку циклу for
, видно лише в тілі циклу і в заголовку циклу for
.
Приклад:
Код | Доступність змінних |
---|---|
|
|
Отож ви завжди можете в своєму коді послідовно написати кілька циклів зі змінною-лічильником із однаковим іменем — проблем не буде.
Приклад:
Код | Доступність змінних |
---|---|
|
|
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ