Всем привет!

Исходя из моего опыта, есть несколько вопросов, которые вам наверняка зададут во время собеседования с Java tech (особенно если вы являетесь специалистом младшего уровня). Один из таких пунктов: «В чем разница (если есть) между ключевыми словами final, finally и finalize в Java?». Ответ настолько прост, что потерять здесь несколько очков будет более чем грустно.

Эти ключевые слова совершенно разные, поэтому будет более чем достаточно объяснить, для чего они используются в Java, чтобы интервьюер был доволен.

окончательный

Это ключевое слово может использоваться с переменными, полями, параметрами, методами и классами.

  • final переменные/поля/параметры являются константами, поэтому их значения не могут быть изменены:

vs

Как и следовало ожидать, класс NonFinalVariable работает без проблем, но FinalVariable выдает ошибку компиляции со следующим выводом:

FinalVariable.java:6: error: cannot assign a value to final variable bestSuperheroEver       
  bestSuperheroEver = "Iron man";       
  ^ 
1 error

Ага, даже Java-компилятор знает, кто тут лучший =)

  • final методов нельзя было переопределить в подклассах:

ВНИМАНИЕ: далее спойлеры по Звёздным Войнам =)

vs

Опять же, первый пример успешно компилируется, а второй нет:

StarWars.java:10: error: doTheDarkSideStuff() in LukeSkywalker cannot override doTheDarkSideStuff() in DarthVader     
  public void doTheDarkSideStuff() {                 
         ^   
  overridden method is final 
1 error
  • final класс не может быть расширен:

vs

Даже Java-компилятор знает, что дополнительные требования от заказчика — это нормально, но продление дедлайна — это что-то невозможное:

FinalClass.java:4: error: cannot inherit from final Deadline 
class ExtendedDeadline extends Deadline {}
                       ^ 
1 error

наконец-то

Это ключевое слово обозначает блок, который можно использовать с оператором try/catch. Сила блока finally в том, что он обязательно будет выполнен (даже если возникнет какое-либо исключение).

ВНИМАНИЕ: на этот раз спойлеры Властелина колец =)

Выход:

Elrond: Let's bring the ring to Mordor
Sam: We did it, the ring was destroyed!
The Eagles are coming!
Exception in thread "main" java.lang.RuntimeException: Mount Doom Volcano: Hi, guys!
    at ordOfTheRingsPlot.main(CommonConsentObject.java:8)

Итак, как мы видим, было выброшено даже необработанное исключение, блок finally был выполнен.

Таким образом, в большинстве случаев блок finally используется для некоторых операций, которые должны быть выполнены при любых обстоятельствах: например, освобождение или закрытие некоторых ресурсов, таких как IO streams (по крайней мере, пока в Java 7 не появилась функция try-with-resources).

завершить

Это метод класса Object, поэтому он доступен и может быть переопределен каждым классом (при необходимости, но, пожалуйста, дважды подумайте, прежде чем делать это - это считается плохой практикой). Он вызывается (сборщиком мусора) для объектов, выбранных для сборки мусора.

Также важно знать, что метод finalize() устарел, начиная с Java 9.

Вот и все. Надеюсь, статья была для вас полезной!

Развлекайся! Увидимся!