Ключевое слово final может стоять перед методами и классами. Если вы ставите префикс перед методом в родительском классе, а дочерний класс наследует методы от родителя, то ключевое слово final предотвращает переопределение этого метода дочерним классом. Если сам класс имеет префикс final, то никакой другой класс не может расширять этот класс.

Резюме. Вспомните, на чем мы остановились в предыдущей статье.





Последнееключевое слово не такое уж сложное понятие. Мы в значительной степени рассмотрели все, что вам нужно знать, во вступительном абзаце, но давайте рассмотрим его на паре примеров.

Два класса, на которых мы сосредоточимся, — это Car и Vehicle. В классе Vehicle есть метод get_make_and_model(), который возвращает строку с маркой и моделью созданного объекта.

Как видите, в настоящее время он отображает только марку и модель, но я также хочу отобразить год. Мы могли бы внести изменения в наш класс Vehicle или переопределить их в нашем классе Car. Давайте поработаем над последним и переопределим его в классе Car. Помните, что наш класс Car наследуется от класса Vehicle. Вот почему мы можем переопределить метод.

Работая с тем же примером, что и раньше, мы создадим определенный тип автомобиля, в данном случае Lamborghini.

Затем мы передаем этот Lamborghini в класс Driver. Класс Driver имеет метод drive(), который вызывает методы turnOn() и turnOff() из класса Car. Именно эти методы вызывают вспомогательный метод get_make_and_model(). Вместо того, чтобы обращаться к ним из класса Vehicle, теперь они будут обращаться к ним из своего собственного класса, поскольку он существует в Car.

Если у вас возникли проблемы с пониманием логики, перечитайте предыдущие статьи, и вы увидите, как мы дошли до этой. На самом деле вам нужно понять, что метод get_make_and_model() теперь существует в классе Car, а также методы turnOn() и turnOff() методы называют это. Они больше не обращаются к методу Vehicle get_make_and_model(), так как он был переопределен. Запуск кода даст ожидаемые результаты, которые отображают год, марку и модель.

Идеальный. До сих пор мы вообще не касались финального ключевого слова. Это было только резюме. Если вы хотите узнать больше о переопределении методов, ознакомьтесь с моей статьей на эту тему.



Что, если мы не хотим, чтобы метод get_make_and_model() переопределялся? Это довольно просто. Просто добавьте ключевое слово final перед модификатором видимости метода.

Если мы снова запустим наш код, мы получим следующую ошибку.

В нем говорится, что мы не можем переопределить окончательный метод Vehicle::get_make_and_model(), чего мы и ожидали.

Итак, что мы можем сделать, если нам действительно нужен год? Итак, нам нужно либо изменить метод в самом классе Vehicle, либо создать совершенно другой метод, например get_year_make_and_model(), внутри нашего класса Car. Нам также придется изменить другие наши методы Car, которые вызывают метод get_make_and_model(), чтобы они теперь вызывали метод get_year_make_and_model().

Большой. До сих пор мы рассматривали добавление ключевого слова final в метод, но что, если бы мы захотели добавить ключевое слово final в сам класс? Чтобы проиллюстрировать эту концепцию, давайте воссоздадим наш класс Lamborghini и передадим его водителю. Мы избавились от него в предыдущей статье, так как сосредоточились на анонимных классах.

Для простоты это просто пустой класс, расширяющий Car. Вы можете притвориться, что у него есть все функции Lamborghini.

Запуск кода дает ожидаемые результаты: включение Lamborghini, вождение, а затем выключение.

Что, если какая-то компания решит, что они хотят сделать подделку Lamborghini? Они хотят легко унаследовать все от класса Lamborghini и выпустить на рынок. Вместо того, чтобы расширять Car, они буквально расширяют Lamborghini.

И угадай что? Он работает точно так же, как Lamborghini. Компания справилась с этим. Как Lamborghini может защитить себя? Включив финальное ключевое слово перед именем класса.

Это автоматически ломает класс LamborghiniKnockoff.

Единственное, что сейчас может сделать класс LamborghiniKnockoff, — это наследоваться от самого класса Car и попытаться воссоздать Lamborghini гораздо более сложным способом.

В заключение, ключевое слово final перед методом означает, что вы не можете переопределить этот метод, а перед классом означает, что вы не можете расширить этот класс.



Дино Кайич в настоящее время является руководителем отдела информационных технологий в компаниях LSBio (LifeSpan BioSciences, Inc.), Absolute Antibody, Kerafast, Everest BioTech, Nordic MUbio и Exalpha. Он также является генеральным директором MyAutoSystem. Он имеет более чем десятилетний опыт разработки программного обеспечения. У него есть B.S. в области компьютерных наук и несовершеннолетнего в области биологии. Его опыт включает в себя создание приложений для электронной коммерции на уровне предприятия, разработку программного обеспечения на основе исследований и содействие распространению знаний посредством письма.

Вы можете связаться с ним в LinkedIn, подписаться на него в Instagram, подписаться на его блог или подписаться на его публикацию на Medium.

Прочитайте все истории Дино Каджика (и тысяч других авторов на Medium). Ваш членский взнос напрямую поддерживает Дино Кайича и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.