Тем, что это даже синтаксически разные вещи. Как и вопрос о
методах Object, это способ начать разговор.
finalize
– метод-финализатор из
Object
, мы уже рассмотрели
в предыдущих постах.
final
– модификатор, который применяется к переменным, полям, методам и классам. Переменная или поле становится неизменяемым и требует
инициализации. Финальный метод нельзя переопределить в наследниках. Финальный класс не может иметь наследников вообще. Используется для создания хорошего (
Effective Java Item 15) API по принципу наименьших привилегий.
Когда в методе используется локальная переменная внешней области видимости, она обязана быть
effectively final. В этом случае ключевое слово
final
необязательно, но значение всё равно не должно меняться.
finally
– часть языковой конструкции
try-catch-finally.
Любое исключение, выброшенное из блока
try
переводит исполнение в самый соответствующий ему
catch
(при наличии). Этим продиктована необходимость располагать блоки
catch
в строгом порядке, от типа исключения-наследника, к родителю. В случае multicatch тот же порядок должен соблюдаться и внутри одного catch.
Больше примеров про порядок.
После выполнится блок
finally
. Выполняется он в любом случае, было исключение или нет. Типичное использование – освобождение ресурсов, обязательные завершающие действия.
Для требующих финализации классов («ресурсов») добавляется интерфейс
AutoCloseable
, повторяющийся код блока
final
выносится в метод
close
и вызывается неявно в конце
try-with-resources. Если в этой конструкции присутствует и явный
finally
, он будет выполнен после.