Выше уже было рассмотрено одно из применений ключевого слова final. Два других применения final связаны с наследованием. Рассмотрим их.
Использование final для отказа от переопределения
В некоторых случаях бывает необходимо отменить одно из свойств языка Java – переопределение методов при наследовании. Методы объявленные как final не могут быть переопределены. Это демонстрируется на следующем примере.
class A
{ final void fun()
{ …}
. . .
}
class B extends A
{ void fun() // error: метод нельзя переопределять
{ …}
. . .
}
Одним из достоинств final-методов является то, что компилятор может их «встраивать» в точку их вызова. Тем самым, сокращая время на их вызов. Встраиваться могут только final-методы. Т.к. эти методы не переопределяемы, то их вызов может быть организован на этапе компиляции – раннее связывание.
Использование final для отмены наследования
Для отмены наследования одного класса другим применяется еще одна форма использования слова final.
final class A
{ . . .
}
class B extends A // error: класс В не может наследоваться от final-класса
{ . . .
}
При этом все методы final-класса А неявно объявляются final-методами. Так же отметим, что абстрактный класс не может быть и final-классом, т.к. он обязательно должен быть определен в подклассе.