Ключевое слово final
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 13 из 87.
Ключевое слово final в Java предотвращает изменение. Его можно применять к переменным, методам и классам, и в каждом случае эффект будет разным.
При применении к переменной final делает её константой: после присваивания её значение нельзя изменить:
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // Можно присвоить значение один раз в конструкторе
}
public void setRadius(double r) {
// this.radius = r; // Ошибка! Нельзя повторно присвоить значение переменной final
}
}Переменную final необходимо инициализировать либо при объявлении, либо в конструкторе. После этого любая попытка присвоить ей другое значение приводит к ошибке компиляции.
Для ссылочных типов final означает, что ссылка не может указывать на другой объект, но содержимое объекта всё ещё может изменяться:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // Ошибка! Нельзя присвоить новое значение
name.append(" Doe"); // Всё верно! Содержимое объекта можно изменятьИспользование final с полями ясно выражает намерение — оно показывает другим разработчикам, что это значение никогда не должно меняться после инициализации. Это особенно полезно для значений конфигурации, идентификаторов или любых данных, которые должны оставаться неизменными на протяжении всего срока жизни объекта.
final-метод нельзя переопределить в подклассе:
class Base {
public final void greet() {
System.out.println("Hi");
}
}
class Child extends Base {
// public void greet() { } // Ошибка! greet() объявлен final в Base
}Класс final вообще нельзя расширить. String — это final-класс, поэтому ни один класс не может его расширить:
final class Config { }
// class MyConfig extends Config { } // Ошибка! Config объявлен как finalЗадание
ЛегкоДавай создадим систему регистрации Student, которая использует ключевое слово final, чтобы защитить данные, которые не должны изменяться после регистрации студента.
Ты создашь два файла, чтобы организовать код:
Student.java: создай класс Student, в котором некоторые данные навсегда фиксируются после задания:- Поле
finalstudentId(String) — присваивается при создании и никогда не может измениться - Поле
finalenrollmentYear(int) — год поступления студента, также является неизменным - Обычное приватное поле
name(String) — его можно обновить, если студент изменит имя - Конструктор, который принимает все три значения и инициализирует поля
- Геттер
getStudentId()для идентификатора студента - Геттер
getEnrollmentYear()для года поступления - Геттер
getName()и сеттерsetName()для имени - Метод
getInfo(), который возвращает:"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
- Поле
Main.java: создай объект Student, затем обнови его имя и выведи информацию о нём. Ты получишь четыре входных значения: идентификатор студента, исходное имя, год поступления и новое имя. Выведи две строки:- Информацию о студенте до изменения имени
- Информацию о студенте после изменения имени
Ты получишь четыре входных значения по порядку: studentId (String), name (String), enrollmentYear (int) и newName (String).
Обрати внимание, как поля final защищают идентификатор студента и год поступления — это постоянные записи, которые не должны меняться, тогда как имя можно обновить с помощью сеттера.
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Считать входные данные
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int enrollmentYear = scanner.nextInt();
scanner.nextLine(); // Считать символ новой строки
String newName = scanner.nextLine();
// TODO: Создать объект Student с начальными значениями
// TODO: Вывести информацию о студенте до изменения имени
// TODO: Изменить имя студента с помощью сеттера
// TODO: Вывести информацию о студенте после изменения имени
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java