Назад Зміст Вперед

7.10. Ключове слово final – методи та класи

В мові програмування Java, службове слово final використовується в кількох варіантах для визначення чогось, що пізніше не може бути зміненим. final може використовуватися при роботі з даними, методами та класами.

В Java, final змінна може бути визначена (ініціалізована) лише один раз і більше не може змінюватися.

Приклад:
public class Sphere {

    public static final double PI = 3.141592653589793;  // це константа
    public final double radius;
    public final double xpos;
    public final double ypos;
    public final double zpos;

    Sphere(double x, double y, double z, double r) {
         radius = r;
         xpos = x;
         ypos = y;
         zpos = z;
    }

    [...]
}

Java дозволяє використання blank finals. Тобто полів класів, які визначені як final, але не ініціалізовані. У будь-якому випадку така змінна повинна бути ініціалізована перед тим, як з нею будуть працювати.

Крім полів, оголошеними як final можуть бути параметри методу і локальні змінні. Оголошення параметра як final перешкоджає його зміни в межах методу, тоді як аналогічне оголошення локальної змінної - присвоєння їй значення більше ніж один раз. Ключове слово final можна вказувати і в оголошенні методів, але в цьому випадку воно має зовсім інше призначення, ніж в змінних. 

final методи

Є дві причини використання final для методів. Перша - ви хочете заборонити перевизначення (override) вашого методу у класах-нащадках (перевантаження(overload) дозволене). А друга причина є чіткість, визначеність та продуктивність для роботи компілятора. Для попередніх версій Java друга причина мала значення. Але починаючи з Java SE5/6 final використовується лише, коли ви чітко хочете зазначити, що хочете заборонити перевизначення вашого методу.

Приклад:
public class MyClass {
    public final void myFinalMethod() {...}
}

final класи


Якщо ви визначаєте свій клас як final, то це означає, що ви не хочете щоб хтось породжував свої класи від вашого.

Приклад:
public final class MyFinalClass {}


Незважаючи на те що перевизначення методів є одним з найефективніших мовних засобів Java, іноді його бажано уникати. Щоб заборонити перевизначення методу, на початку його оголошення слід вказати ключове слово final.
Методи, оголошені як final, перевизначатися не можуть. Такий спосіб застосування ключового слова final демонструється в наведеному нижче фрагменті коду.
class А {
final void meth ( ) {
System.out.println ( "Це завершений метод" ) ;
class В extends А {
void meth ( ) ( //ПОМИЛКА! Цей метод не може бути перевизначений!
System.out.println ( "Не можна перевизначити" ) ;
Метод meth ( ) оголошений як  final і тому не може бути перевизначений у класі B. Будь-яка спроба перевизначити його приведе до помилки під час компіляції.

Попередження наслідування за допомогою кпючового слова final 

Іноді потрібно запобігти успадкування класу. Для цього на початку оголошення класу слід вказати ключове слово final. Оголошення класу завершеного неявно робить завершеними і всі його методи. Неважко здогадатися, що одночасне оголошення класу як abstract і final неприпустимо, оскільки абстрактний клас принципово є незавершеним і тільки його підкласи надають повну реалізацію методів. Нижче наведено приклад завершеного класу.
final class А {
//...
//Наступний клас недопустимий
class B extends А {//Помилка! Клас А не може мати підкласи
//...
Отже, класс В не може наслідуватися від класу А, оскільки клас А оголошено final.


P redotvrashcheniya na
http://opensourcerules.net/java/gl4_2.html
.