Page 79 - 6253
P. 79
вона є незмінною, тобто константою. Слово final перед посиланням на об’єкт робить
незмінним тільки посилання, але не сам об’єкт. У цьому випадку посилання вже не
зможе вказувати на інший об’єкт, а сам об’єкт при цьому можна змінювати. Це
обмеження стосується і масивів, які у мові Java є об’єктами. Значення змінним
класу, оголошені як final, необхідно задавати або під час їхнього оголошення, або у
конструкторі класу.
Також у мові Java дозволено оголошувати зі словом final параметри методів,
що забороняє змінювати їхні значення під час виклику відповідного методу.
Якщо слово final додати перед оголошенням методу, то такий метод стає
незмінним. Ця властивість використовується у випадку, коли необхідно заборонити
перекриття методу в підкласах. Наприклад,
class Box {
final double volume() {
return width * height * depth;
}
}
Будь-яка спроба перекрити метод, оголошений як final, призведе до помилки
під час компіляції.
З іншого боку, методи, оголошені як final, дозволяють оптимізувати
програмний код. Компілятор організовує звертання до них як до виклику
вбудованого коду (фактично заміняє виклик методу на копію реального коду, який є
в цьому методі), оскільки відомо, що вони не будуть перекриті у підкласі.
У мові Java використовується методика пізнього зв’язування (late binding),
тобто рішення, який саме метод буде викликано, приймається під час виконання
програми. Проте методи оголошені як final не можуть бути перекриті з іншого
класу, тому питання, пов’язані з їхнім викликом, вирішуються на стадії компіляції.
Такий підхід називають раннім зв’язуванням (early binding).
Ключове слово final використовується також з метою заборони створення
підкласів деякого визначеного класу. У такій інтерпретації його поміщають на
початку визначення класу. Оголошення класу як final неявно робить усі його методи
також final (без можливості перекриття).
78