Menu
Coddy logo textTech

Ключевое слово 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");  // OK! Содержимое объекта может меняться

Использование final с полями четко передает намерение — это сообщает другим разработчикам, что данное значение никогда не должно меняться после инициализации. Это особенно полезно для конфигурационных значений, идентификаторов или любых данных, которые должны оставаться неизменными на протяжении всего жизненного цикла объекта.

challenge icon

Задание

Легко

Давайте создадим систему регистрации Student, которая использует ключевое слово final для защиты данных, которые никогда не должны меняться после регистрации студента.

Вы создадите два файла для организации вашего кода:

  • Student.java: Создайте класс Student, в котором определенная информация навсегда блокируется после установки:
    • Поле final с именем studentId (String) — присваивается при создании и никогда не может быть изменено
    • Поле final с именем enrollmentYear (int) — год зачисления студента, также является постоянным
    • Обычное приватное поле name (String) — может быть обновлено, если студент изменит свое имя
    • Конструктор, который принимает все три значения и инициализирует поля
    • Геттер getStudentId() для ID студента
    • Геттер getEnrollmentYear() для года зачисления
    • Геттер getName() и сеттер setName() для имени
    • Метод getInfo(), который возвращает: "ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
  • Main.java: Создайте объект Student, затем обновите его имя и отобразите информацию. Вы получите четыре входных значения: ID студента, начальное имя, год зачисления и новое имя для обновления. Выведите две строки:
    • Информацию о студенте до изменения имени
    • Информацию о студенте после изменения имени

Вы получите четыре входных значения по порядку: studentId (String), name (String), enrollmentYear (int) и newName (String).

Обратите внимание, как поля final защищают ID студента и год зачисления — это постоянные записи, которые не должны меняться, в то время как имя может быть обновлено через его сеттер.

Попробуйте сами

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: Обновите имя студента, используя setter
        
        // TODO: Выведите информацию о студенте после изменения имени
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование