Использование ключевого слова final для предотвращения переопределения

Хотя переопределение методов — одно из наиболее мощных средств Java, в некоторых случаях его желательно избежать. Чтобы запретить переопределение метода, в начале его объявления необходимо указать ключевое слово final. Методы, объявленные как final, переопределяться не могут. Следующий фрагмент кода иллюстрирует это применение ключевого слова final.

class А {
final void meth() {
System.out.println("Это метод final.");
}
}
class В extends A {
void meth() {
// ОШИБКА! Этот метод не может быть переопределен.
System.out.println("Не допускается!");
}
}

Поскольку метод meth () объявлен как final, он не может быть переопределен в классе В. Попытка выполнить это переопределение приведет к ошибке времени компиляции.

Иногда методы, объявленные как final, могут способствовать увеличению производительности программы. Компилятор вправе вставлять вызовы этих методов непосредственно в строку, поскольку он "знает", что они не будут переопределены подклассом. Часто при вызове небольшого метода типа final компилятор Java может копировать байт-код подпрограммы непосредственно в строку скомпилированного кода вызывающего метода, тем самым снижая значительные накладные расходы системных ресурсов, связанные с вызовом метода. Помещение методов типа final в строку вызывающего кода — лишь потенциальная возможность. Обычно Java разрешает вызовы методов динамически, во время выполнения. Такой подход называют поздним связыванием. Однако поскольку методы типа final не могут переопределяться, обращение к такому методу может быть разрешено во время компиляции. Этот подход называют ранним связыванием.