Использование Final, Finally и Finalize на Java
Если у вас есть какой-либо опыт интервью, вы могли заметить, что интервьюеры, как правило, задают сложные вопросы, которые обычно берутся из базовых понятий. Один из таких вопросов, который чаще всего задают, заключается в различении между Final, Finally and Finalize на Java.
Что такое Java final?
В Java final – это ключевое слово, которое также можно использовать в качестве модификатора доступа. Другими словами, final ключевое слово используется для ограничения доступа пользователя. Он может использоваться в различных контекстах, таких как:
С каждым из них последнее ключевое слово имеет разный эффект.
1. Переменная
Всякий раз, когда ключевое слово final в Java используется с переменной, полем или параметром, это означает, что после передачи ссылки или создания экземпляра его значение не может быть изменено во время выполнения программы. Если переменная без какого-либо значения была объявлена как final, тогда она называется пустой / неинициализированной конечной переменной и может быть инициализирована только через конструктор.
Давайте теперь посмотрим на пример.
2. Метод
В Java всякий раз, когда метод объявляется как final, он не может быть переопределен никаким дочерним классом на протяжении всего выполнения программы.
Давайте посмотрим на пример.
3. Класс
Когда класс объявляется как final, он не может наследоваться ни одним подклассом. Это происходит потому, что, как только класс объявлен как final, все члены-данные и методы, содержащиеся в классе, будут неявно объявлены как final.
Кроме того, как только класс объявлен как final, он больше не может быть объявлен как абстрактный. Другими словами, класс может быть одним из двух, конечным или абстрактным.
Давайте посмотрим на пример.
Блок Finally
В Java, Finally, является необязательным блоком, который используется для обработки исключений. Обычно ему предшествует блок try-catch. Блок finally используется для выполнения важного кода, такого как очистка ресурса или освобождение использования памяти и т. д.
Блок finally будет выполняться независимо от того, обрабатывается ли исключение или нет. Таким образом, упаковка кодов очистки в блок finally считается хорошей практикой. Вы также можете использовать его с блоком try без необходимости использовать блок catch вместе с ним.
Метод Finalize
Finalize – это защищенный нестатический метод, который определен в классе Object и, таким образом, доступен для всех без исключения объектов в Java. Этот метод вызывается сборщиком мусора до полного уничтожения объекта.
Иногда, объекту может потребоваться выполнить какую-то важную задачу, такую как закрытие открытого соединения, освобождение ресурса и т. д., Прежде чем он будет уничтожен. Если эти задачи не будут выполнены, это может снизить эффективность программы.
Таким образом, сборщик мусора вызывает его для объектов, на которые больше нет ссылок и которые помечены для сбора мусора.
Этот метод объявлен как защищенный, чтобы ограничить его использование извне класса. Но вы можете переопределить его внутри класса, чтобы определить его свойства во время сборки мусора.
В заключение я добавил сравнение всех трех ключевых слов, которое поможет вам быстро определить основные различия.
Константы в Java на примерах
«Constant (константа)» – слово в английском языке, относящееся в основном к «ситуации, которая не меняется». Это одна из фундаментальных концепций программирования в Java, и у нее нет каких-либо специальных предпосылок или концепций, которые необходимо знать перед изучением, кроме базовых навыков программирования.
Константы в Java используются, когда необходимо реализовать «статическое» или постоянное значение для переменной. Язык программирования напрямую не поддерживает константы. Чтобы сделать любую переменную ею, мы должны использовать модификаторы static и final.
Синтаксис
Причина, по которой мы должны использовать как статические, так и конечные модификаторы, заключается в том, что:
Пример
Допустим, нам нужно определить, кто имеет право на получение постоянных водительских прав в группе людей. Мы уже знаем, что минимальный возраст для получения постоянных водительских прав составляет 18 лет.
Поэтому вместо того, чтобы просить пользователя ввести минимальный возраст для сравнения, мы объявляем идентификатор MIN_AGE как постоянное целое число со значением 18.
Зачем нужны?
Константы делают вашу программу более легкой для чтения и понимания, когда ее читают другие. Использование их также повышает производительность, поскольку константы кэшируются как JVM, так и вашим приложением.
Статические и окончательные модификаторы
С помощью модификатора final типы данных Primitive, такие как int, float, char, byte, long, short, double, Boolean, можно сделать неизменяемыми / неизменяемыми. Вместе, как мы поняли ранее, эти модификаторы создают постоянную переменную.
Общий синтаксис
Это соглашение использовать заглавную букву имени переменной, которую мы хотим объявить как константу. Если мы сохраним спецификатор доступа для постоянной переменной как частный, то его значения не могут быть изменены в этом классе.
Если мы оставим спецификатор доступа общедоступным для постоянной переменной, то его значения можно изменить в любом месте программы.
Пример 1
Пример 2
Потенциальные проблемы с постоянными переменными
Работа ключевого слова final в Java заключается в том, что указатель переменной на значение становится неизменным. Это означает, что указатель не может изменить местоположение, на которое он указывает.
Нет гарантии, что объект, на который ссылаются, останется прежним, но только то, что завершаемая переменная всегда будет содержать ссылку на один и тот же объект. Если указанный объект является изменяемым (то есть имеет поля, которые могут быть изменены), тогда константная переменная может содержать значение, отличное от того, которое было изначально присвоено.
Перечисление
Пример 1
В этом примере мы использовали перечисление как enum Apple
Каждый из них неявно объявлен как публичный статический финальный член Apple. Переменная перечисления может быть создана как другая примитивная переменная. Он не использует «новый» для создания объекта.
‘ap’ имеет тип Apple, единственные значения, которые могут быть назначены (или могут содержать), являются значениями, определенными перечислением.
Например, это назначает
Все перечисления имеют два предопределенных метода: values() и valueOf(). Синтаксис этих встроенных методов:
Метод values() дает массив, который состоит из списка констант перечисления. Метод valueOf() дает константу перечисления, значение которой соответствует строке, переданной в str.
Пример 2
В приведенном выше примере мы использовали два встроенных метода перечисления.
BestProg
Содержание
Поиск на других ресурсах:
1. Какое назначение использования спецификатора final в программах на Java?
Спецификатор final предназначен для объявления неизменных данных, методов и классов. Неизменные данные, методы или классы не могут изменять свое значение или программный код на протяжении выполнения всей программы.
Спецификатор final может применяться к таким элементам языка как:
Существуют два способа установить начальное значение неизменных данных:
4. Какое отличие между неизменными и изменяемыми данными? Какие особенности неизменных данных в классе?
Между неизменными данными и изменяемыми данными есть два следующих отличия:
5. Пример, который демонстрирует применение спецификатора final с одиночными данными (переменными)
Класс также содержит объявление трех конструкторов, которые инициализируют начальными значениями те неизменные ( final ) данные, которые при объявлении не получили никаких значений.
Реализация класса имеет следующий вид:
В вышеприведенном коде, неизменные данные (поля) a и f есть пустыми константами, которые обязательно должны быть инициализированы в конструкторе класса.
Использование класса SetConstData может быть следующим:
Компилятор Java такое описание пропускает с предупреждением
что означает, что данные могли быть неинициализированы.
8. Какие особенности неизменных данных, которые объявлены как статические ( static )?
В сравнении с нестатическими, для статических неизменных данных можно выделить следующие особенности:
9. Что такое пустые константы?
Пустые константы – это поля класса, которые объявляются со спецификатором final но которые не инициализированы начальным значением (которым не было присвоенное начальное значение).
Значение пустой константы обязательно должны инициализироваться в конструкторе класса.
10. Могут ли статические ( static ) поля данных класса быть пустой константой?
11. Что такое неизменные аргументы? Пример
Программный код класса FinalArguments следующий
Ниже приведено использование методов класса FinalArguments
Если метод Sqr() в классе FinalArguments переписать, например, следующим образом
то компилятор выдаст ошибку
12. Для чего используются неизменные методы?
В языке программирования Java спецификатор final можно ставить перед объявлением метода. Такой метод называется неизменным методом.
Неизменный метод объявляется в следующих случаях:
13. Что такое inline-методы?
В большинстве языков программирования обычный вызов метода из некоторого кода требует выполнения следующей последовательносты обязательных операций:
Inline-методы – это методы, тело которых непосредственно вставляется в программный код вызывающей программы (метода). В этом случае отсутствуют лишние шаги при вызове метода: занесение аргументов в стек, переход и возврат из метода. Отсутствие лишних шагов приводит к повышению скорости выполнения вызванного метода. То есть, увеличивается общее быстродействие программы, которая вызвала метод.
Однако, если тело inline-метода есть довольно большим (содержит много кода), то это приводит к чрезмерному увеличению программы, которая его вызвала.
14. Пример объявления и использования неизменных методов
Объявление классов A и B имеет вид:
Использование экземпляров классов A и B может быть, например, следующим
Если в классе B попробовать объявить методы Set() и Get() следующим образом
то компилятор выдаст ошибку
15. Какие особенности использования спецификаторов final и private для методов?
16. Может ли неизменный метод быть объявлен как статический ( static )?
Да. В этом случае, вызов статического неизменного метода из класса такой же как и обычного статического метода (без спецификатора final ).
17. Что такое неизменные классы? В каких случаях целесообразно применять неизменные классы? Пример
Пример. Пусть задано объявление неизменного класса A :
После такого объявления, объявить класс, который наследует (расширяет) класс A нельзя. Если попробовать это сделать, то компилятор выдаст ошибку.
компилятор выдает ошибку:
Ключевое слово “final” в Java
Узнайте, что означает ключевое слово final в Java применительно к классам, методам и переменным.
1. Обзор
В то время как наследование позволяет нам повторно использовать существующий код, иногда нам нужно установить ограничения на расширяемость по разным причинам; ключевое слово final позволяет нам делать именно это.
В этом уроке мы рассмотрим, что означает ключевое слово final для классов, методов и переменных.
2. Заключительные занятия
Любая попытка наследовать от класса final приведет к ошибке компилятора. Чтобы продемонстрировать это, давайте создадим final класс Cat :
И давайте попробуем его расширить:
Мы увидим ошибку компилятора:
Мы просто не можем его продлить.
Обратите внимание, что создание класса final означает, что ни один другой программист не может его улучшить. Представьте, что мы используем класс и у нас нет исходного кода для него, и есть проблема с одним методом.
Если класс окончательный, мы не можем расширить его, чтобы переопределить метод и устранить проблему. Другими словами, мы теряем расширяемость, одно из преимуществ объектно-ориентированного программирования.
3. Окончательные методы
Этот метод проверяет, является ли поток живым. Невозможно правильно переопределить метод IsAlive() по многим причинам. Один из них заключается в том, что этот метод является родным. Машинный код реализован на другом языке программирования и часто специфичен для операционной системы и оборудования, на котором он работает.
Давайте создадим класс Dog и сделаем его sound() метод final :
Теперь давайте расширим класс Dog и попробуем переопределить его метод sound() :
Мы увидим ошибку компилятора:
Если наш конструктор вызывает другие методы, мы обычно должны объявлять эти методы final по вышеуказанной причине.
Во втором случае мы не можем этого сделать.
4. Конечные переменные
Переменные, помеченные как final , не могут быть переназначены. После инициализации переменной final она не может быть изменена.
4.1. Конечные примитивные переменные
Давайте объявим примитивную конечную переменную i, затем присвоим ей 1.
И давайте попробуем присвоить ему значение 2:
4.2. Конечные Опорные переменные
Чтобы продемонстрировать это, давайте объявим final ссылочную переменную cat и инициализируем ее:
Если мы попытаемся переназначить его, мы увидим ошибку компилятора:
Но мы можем изменить свойства экземпляра Cat :
4.3. Заключительные поля
Поля Final могут быть как константами, так и полями для однократной записи. Чтобы отличить их, мы должны задать вопрос — включили бы мы это поле, если бы мы сериализовали объект? Если нет, то это не часть объекта, а константа.
Для статических конечных полей это означает, что мы можем их инициализировать:
Например, final поля, это означает, что мы можем их инициализировать:
В противном случае компилятор выдаст нам ошибку.
4.4. Заключительные Аргументы
Ключевое слово final также законно ставить перед аргументами метода. A окончательный аргумент не может быть изменен внутри метода :
Приведенное выше назначение вызывает ошибку компилятора:
5. Заключение
В этой статье мы узнали, что означает ключевое слово final для классов, методов и переменных. Хотя мы не можем часто использовать ключевое слово final в нашем внутреннем коде, это может быть хорошим дизайнерским решением.
4.2 Ключевое слово final
4.2 Ключевое слово final
Модификатор ‘final’ обращается к классам, методам и переменным. Значение final изменяется от контекста к контексту, но основная идея та же самая: Особенности final не могут быть изменены.
4.2.1 Класс final
Класс, объявленный, объявленный с модификатором ‘final’ не может иметь подклассов. Таким образом модификатор ‘final’ добавляется к классу, когда его спецификация заморожена.
Теперь мы увидим, как написать класс final:
Пример 3:
class Test<>
final class TestFinal <
int i = 7;
int j = 1;
Test x = new Test() ;
void f() <>
>
// class Further extends TestFinal <>
// error: Cannot extend final class ‘TestFinal’
public class FinalDemo
<
public static void main(String[] args)
<
TestFinal n = new TestFinal();
n.f();
n.i =40;
n. j++;
>
>
Определение класса как final просто исключает наследование и ничего более. Однако, по причине предотвращения наследования, все методы в классе final неявно final, с этого момента нет способа отменить это.
4.2.2 Метод final
При создании класса final не всё удовлетворяет нашим потребностям, мы действительно хотим только защитить некоторые из методов нашего класса от того, чтобы быть отменёнными, мы можем использовать ключевое слово final в объявлении метода, чтобы указать компилятору, что метод не может быть отменен подклассами. Метод final реализуется точно однажды, в объявлении класса. Такой метод не может быть отменен: подклассы не могут заменить метод новым определением. Любые частные методы в классе неявно final. Поскольку мы не можем обратиться к частному методу, мы не можем отменить его (компилятор дает сообщение об ошибках). Если класс final, то все его методы неявно final, то есть гарантируется неотменяемость в любом подклассе.
4.2.3 Переменная final
Переменная final может быть установлена только однажды, разрешая нам объявить частые константы. Такую переменную можно оставить неназначенной в месте декларации, создавая blank finals (пустые переменные final). Но все переменные final должны быть назначены точно однажды. Эти переменные применяются главным образом в двух ситуациях: для предотвращения случайного изменения параметра метода, а также переменных, к которым обращаются анонимные классы.
Следующая программа показывает использованию модификатора final:
Пример 4:
class FinalDemo
<
public static void main(String args[])
<
final int noChange = 20;
noChange =30;
System.out.println( Value of noChange = + noChange);
>
>
Когда мы скомпилируем эту программу, мы получим следующее сообщение об ошибках
Рисунок 4.3: Вывод








