Skip to content

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

В Java ключевое слово final используется для объявления констант и неизменяемых данных, а также для предотвращения наследования и переопределения методов. Оно может применяться к переменным, методам и классам. Понимание использования final позволяет писать более безопасный и предсказуемый код, предотвращая нежелательные изменения и модификации.

Цель:

  • Познакомиться с модификатором доступа final.
  • Изучить его использование при работе с переменными, методами и классами.
  • Освоить возможности, которые предоставляет final для создания неизменяемых объектов и предотвращения наследования.

Использование final с переменными

Когда переменная объявляется с модификатором final, её значение нельзя изменить после инициализации. Это полезно для создания констант.

Синтаксис:

final тип имя_переменной = значение;

Пример 1: Использование final с примитивными типами

public class Main {
    public static void main(String[] args) {
        final int MAX_VALUE = 100;

        // Попытка изменить значение переменной вызовет ошибку
        // MAX_VALUE = 200;  // Ошибка компиляции
        System.out.println("Максимальное значение: " + MAX_VALUE);
    }
}

В этом примере: - Переменная MAX_VALUE объявлена как final, поэтому её значение после инициализации изменить нельзя. - Использование final делает переменную константой, что позволяет явно указать, что значение не должно изменяться.

Пример 2: Использование final с объектами

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

public class Main {
    public static void main(String[] args) {
        final StringBuilder sb = new StringBuilder("Hello");

        // Можно изменять внутреннее состояние объекта
        sb.append(" World!");
        System.out.println(sb.toString());  // Вывод: Hello World!

        // Попытка изменить ссылку вызовет ошибку
        // sb = new StringBuilder("New String");  // Ошибка компиляции
    }
}
  • В данном примере ссылка на объект StringBuilder является неизменяемой, но содержимое объекта можно изменять.

Использование final с методами

Модификатор final, применённый к методу, запрещает его переопределение в подклассах. Это может быть полезно, когда необходимо, чтобы логика метода осталась неизменной во всех производных классах.

Пример 3: Использование final с методами

class Parent {
    public final void show() {
        System.out.println("Этот метод не может быть переопределён.");
    }
}

class Child extends Parent {
    // Попытка переопределить метод вызовет ошибку
    // public void show() {  // Ошибка компиляции
    //     System.out.println("Переопределённый метод.");
    // }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Parent();
        obj.show();
    }
}
  • Метод show() объявлен как final в классе Parent, что означает, что ни один класс-наследник не сможет его переопределить.

Использование final с классами

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

Пример 4: Использование final с классами

final class FinalClass {
    public void display() {
        System.out.println("Это метод final-класса.");
    }
}

// Попытка наследования вызовет ошибку
// class SubClass extends FinalClass {  // Ошибка компиляции
// }

public class Main {
    public static void main(String[] args) {
        FinalClass obj = new FinalClass();
        obj.display();
    }
}
  • Класс FinalClass объявлен как final, поэтому другой класс не может от него наследовать.

Ключевые моменты использования final:

  1. Переменные:
  2. Примитивные типы: значение переменной нельзя изменить после инициализации.
  3. Объекты: ссылка на объект не может быть изменена, но внутренние данные объекта могут изменяться.

  4. Методы:

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

  6. Классы:

  7. Классы, объявленные с final, не могут быть наследованы.

Использование final и неизменяемость

Использование final в сочетании с классами и переменными часто используется для создания неизменяемых объектов. Примером такого подхода является класс String, который является неизменяемым (immutable) в Java.

Пример 5: Неизменяемый класс String

public class Main {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = str1.concat(" World");

        System.out.println(str1);  // Вывод: Hello
        System.out.println(str2);  // Вывод: Hello World
    }
}
  • В этом примере при вызове метода concat() новый объект String создаётся, и переменная str1 остаётся неизменной. Это возможно благодаря тому, что класс String является неизменяемым.

Заключение

Ключевое слово final предоставляет несколько мощных возможностей для контроля поведения программ в Java: - Делает переменные и объекты неизменными после их инициализации. - Предотвращает переопределение методов, что помогает защитить важную логику от изменений в подклассах. - Запрещает наследование классов, обеспечивая сохранение их поведения.

Понимание и правильное использование final помогает создавать безопасный, предсказуемый и поддерживаемый код, особенно в больших проектах.

пример

https://gitlab.com/synergy9980417/tema2_urok6