вторник, 17 ноября 2020 г.

Ключевое слово final

   Ключевое слово final (завершённый) может использоваться при объявлении классов, методов, переменных (в том числе аргументов методов).

 

   Для класса это означает, что класс не сможет иметь подклассов, т.е. запрещено наследование класса. (не допускается создание наследников такого класса, и на своей ветке наследования он является последним)

   (такой класс не является предком какого-либо класса).

 

   Попытка расширить final-класс приведёт к ошибке компиляции.

   Объявление класса завершенным неявно делает завершенными и все его методы.

   Это полезно при создании immutable (неизменяемых) объектов, например, класс String объявлен, как final.

   Следует также отметить, что к абстрактным классам (с ключевым словом abstract), нельзя применить модификатор final, т.к. это взаимоисключающие понятия.

(Одновременное объявление класса как abstract и final недопустимо).

 

   Поле (переменная класса) также может быть объявлено final, что означает, что оно инициализируется ровно один раз, и больше не будет менять своего значения.

   Статические поля класса также могут быть объявлены как final, что означает, что они должны быть проинициализированы строго один раз, и затем уже больше не менять своего значения.

 

   Локальный класс (класс, объявленный в блоке операторов между фигурными скобками, например, в теле метода, цикла или оператора ветвления) имеет доступ к членам класса, в котором он объявлен, а также к локальным переменным, объявленным как final.

   Локальные классы, как и внутренние, не могут содержать статические методы и статические поля, не объявленные как final, и могут обращаться только к статическим полям внешнего класса.


   Для интерфейса все поля интерфейса должны быть public static final, поэтому эти модификаторы указывать необязательно и даже нежелательно, чтобы не загромождать код.

   (К полям интерфейса по умолчанию применяются модификаторы public static final).

 

   Для метода final означает, что такой метод не может быть переопределен в подклассах (в наследниках) (устанавливается чтобы запретить переопределение метода в классах наследниках).

   (он не может быть переопределён потомками данного класса) 


   Это полезно, когда необходимо, чтобы исходную реализацию нельзя было переопределить.

   Если класс А содержит завершенный метод, который не может быть переопределен в классе наследнике Б, то при попытке возникнет ошибка компиляции.

 

    Можно считать, что все методы final-класса, а также все private-методы любого класса являются final:

   Не имеет смысла объявлять метод private как final, так как private метод не виден в наследниках, соответственно не может быть переопределен.

 

   Также конструктор не может быть объявлен как final.

   Для каждого аргумента метода можно указать ключевое слово final перед указанием его типа - в этом случае такой параметр не может менять своего значения в теле метода.

    Статические методы могут быть объявлены как final, что означает, что их нельзя переопределять в классах-наследниках.

 

   Для объекта (например, массива) final означает, что после присвоения ссылки на объект, уже нельзя ее изменить, но можно изменять состояние объекта.

 

   Для переменной объявление её final позволяет предотвратить изменение содержимого переменной, сделав ее, по существу, константой.

   Ключевое слово final указывают перед типом переменной, которую в этом случае необходимо сразу проинициализировать и впоследствии никогда не менять ее значение. Если попытаться изменить значение final-переменной, это приведет к ошибке компиляции. Таким образом, final-переменные становятся чем-то вроде констант, но, на самом деле, некоторые инициализаторы могут вычисляться только во время исполнения программы.

   final переменная класса, объявленная как не static, должна инициализироваться при объявлении или в теле конструктора или блоке инициализации, иначе произойдет ошибка компиляции.

   final переменные, объявленные как static, должны быть проинициализированы при объявлении или в блоке инициализации, также объявленном как static. В противном случае, опять получится ошибка компиляции. 

   Кроме переменных, объявленными как final могут быть параметры метода и локальные переменные. 

   Константы Java Константы – это переменные, значение которых не меняется. Константами в Java принято называть public static final переменные класса. Имена констант принято задавать только заглавными буквами, а слова в имени разделять знаком подчеркивания: NAME_SURNAME. 

   Преимущества от введения констант: если необходимо изменить значение константы, то это можно сделать в одном месте, также имя константы непосредственно объясняет значение хранимых данных.

 

   Существует понятие - effectively final. Применяется оно только к переменным (в том числе аргументам методов). Суть в том, что не смотря на явное отсутствие ключевого слова final, значение переменной не изменяется после инициализации. Другими словами, к такой переменной можно подставить слово final без ошибки компиляции.

  effectively final переменные могут быть использованы внутри локальных классов (Local Inner Classes), анонимных классов (Anonymous Inner Classes), стримах (Stream API).

Комментариев нет:

Отправить комментарий

Наследование в Java

   «родительское/дочернее»     Наследование (inheritance) - свойство системы, позволяющее описать (создать) новый класс на основе уже су...