Java for Beginner
742 subscribers
708 photos
196 videos
12 files
1.14K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Основы ООП в Java

Глава 6. Ключевые модификаторы ООП

final: переменные, методы, классы

Модификатор final в Java означает "окончательный" и используется для предотвращения изменений. В зависимости от контекста — переменные, методы или классы — он ограничивает возможность переопределения, изменения или наследования.

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



final — один из ключевых инструментов для создания robust и maintainable кода в ООП.

1. Final переменные: Неизменяемые значения
Когда переменная помечена final, ее значение нельзя изменить после инициализации. Это делает переменную константой.

Типы переменных:
Локальные: Инициализируются один раз в методе.
Поля класса: Должны быть инициализированы при объявлении, в блоке инициализации или конструкторе.
Ссылочные типы: Ссылка неизменна, но объект, на который она указывает, может меняться (если он mutable).


Пример:
public class Circle {
private final double PI = 3.14159; // Константа
private final double radius; // Поле, инициализируется в конструкторе

public Circle(double radius) {
this.radius = radius; // Инициализация final
}

public double getArea() {
final double area = PI * radius * radius; // Локальная final переменная
// area = 10; // Ошибка: нельзя изменить
return area;
}
}


Нюанс: Для final ссылки (например, final StringBuilder sb = new StringBuilder();) нельзя переназначить sb = new StringBuilder();, но можно sb.append("text");.

Практика:

Константы: Обычно static final (например, public static final double PI = 3.14159;).
Именование: Константы в верхнем регистре с подчеркиваниями (MAX_VALUE).


2. Final методы: Запрет переопределения
Когда метод помечен final, его нельзя переопределить (override) в подклассах. Это полезно, когда поведение метода должно остаться неизменным.

Пример с наследованием:
public class Animal {
public final void eat() {
System.out.println("Животное ест.");
}
}

public class Dog extends Animal {
// Ошибка, если попытаться:
// @Override
// public void eat() { System.out.println("Собака ест кости."); }
}


Зачем:
Гарантия неизменного поведения.
Безопасность: Критичные методы (например, валидация) не изменятся.
Нюанс:
final не влияет на вызов метода, только на override.

3. Final классы: Запрет наследования
Когда класс помечен final, его нельзя использовать как суперкласс (extends). Это предотвращает создание подклассов.

Пример:
public final class ImmutablePoint {
private final int x;
private final int y;

public ImmutablePoint(int x, int y) {
this.x = x;
this.y = y;
}

public int getX() { return x; }
public int getY() { return y; }
}

// Ошибка:
// public class ExtendedPoint extends ImmutablePoint {}


Зачем:
Иммутабельность: Классы вроде String или Integer — final, чтобы гарантировать неизменность.
Безопасность: Например, в криптографии или конфигурации.
Дизайн: Сигнализирует, что класс завершен и не предназначен для расширения.


#Java #для_новичков #beginner #OOP #final
👍3
Все нюансы final

Переменные:
Инициализация: Должна быть до завершения конструктора (для полей) или до использования (локальные).
Blank
final: final поле без начального значения, но с обязательной инициализацией в конструкторе.
Нюанс:
final List<String> list = new ArrayList<>(); — можно менять содержимое list, но не саму ссылку.

Методы:
Не влияет на полиморфизм: Вызов метода работает как обычно.
Нельзя с abstract: Абстрактный метод требует override,
final запрещает.
Нюанс: Используйте для методов, где логика критична (например, security checks).


Классы:
Все методы implicitly final, но это не нужно явно указывать.
Нюанс: String, Integer, Double — примеры
final классов в Java.

Ошибки:

Изменение final переменной: Ошибка компиляции.
Override
final метода: Ошибка компиляции.
Extends
final класса: Ошибка компиляции.

Дизайн и производительность:
Final улучшает оптимизацию JIT (компилятор знает, что не будет изменений).
Избегайте чрезмерного использования:
Final классы ограничивают гибкость (например, тестирование с mocking).
Константы: static
final для глобальных неизменяемых значений.

Сценарии использования:
Immutable классы: Все поля final, класс final.
Utility классы: Часто
final (например, java.lang.Math).
Конфигурации:
Final поля для неизменяемых настроек.


Как создать это в IntelliJ IDEA

Final переменные: Объявите поле с final, IDE проверит инициализацию.
Final методы: Добавьте final перед методом, IDE предупредит о попытке override.
Final классы: Добавьте final к классу, IDE покажет ошибку при extends.
Тестирование: Создайте Main и проверьте поведение.



Полезные советы для новичков

Константы: Используйте static final для PI, MAX_VALUE и т.д.
Иммутабельность: Делайте поля
final для защиты данных.
Дизайн:
Final классы для завершенных реализаций, но не злоупотребляйте.
Проверяйте: Попробуйте override
final метода — IDE покажет ошибку.
Ресурсы: Oracle Tutorials on
Final Classes and Methods.


#Java #для_новичков #beginner #OOP #final
👍5