Тем, что это даже синтаксически разные вещи. Как и вопрос о
методах 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, он будет выполнен после.