Всем привет!
Исходя из моего опыта, есть несколько вопросов, которые вам наверняка зададут во время собеседования с 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.
Вот и все. Надеюсь, статья была для вас полезной!
Развлекайся! Увидимся!