Несмотря на то что переопределение методов является одним из самых эффективных языковых средств Java, иногда его желательно избегать.
Чтобы запретить переопределение метода, в начале его объявления следует указать ключевое слово final.
Методы, объявленные как final, переопределяться не могут. Такой способ применения ключевого слова final демонстрируется в приведенном ниже фрагменте кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class FirstClass { final void niceMethod() { System.out.println("Это завершенный метод."); } } class SecondClass extends FirstClass { void niceMethod() { // Ошибка! Этот метод не может быть переопределен. System.out.println("Недопустимо!"); } } |
Метод niceMethod() объявлен как final и поэтому не может бьпъ переопределен в классе SecondClass. Любая попытка переопределить его приведет к ошибке во время компиляции.
Иногда методы, объявленные как final, могут способствовать увеличению производительности программы.
Компилятор вправе встраивать вызовы этих методов, поскольку ему известно, что они не будут переопределены в подклассе.
Нередко при вызове небольшого завершенного метода компилятор Java может встраивать байт-код для подпрограммы непосредственно в скомпилированный код вызывающего метода, тем самым снижая издержки на вызов метода.
Такая возможность встраивания вызовов присуща только завершенным методам. Как правило, вызовы методов разрешаются в Java динамически во время выполнения.
Такой способ называется поздним связыванием. Но поскольку завершенные методы не могут быть переопределены, их вызовы могут быть разрешены во время компиляции. И такой способ называется ранним связыванием.