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

Переопределение и ключевое слово super

Что такое переопределение методов в ООП?

Переопределение (method overriding) — это возможность подкласса предоставить свою реализацию метода, унаследованного от суперкласса. Это воплощает полиморфизм: объект подкласса может вести себя иначе, чем суперкласс, но сохранять ту же сигнатуру метода.

Когда использовать: Если поведение суперкласса не подходит для подкласса, но имя и параметры метода должны остаться теми же (например, все животные едят, но собака ест по-своему).

Правила переопределения:
Сигнатура метода (имя, параметры) должна быть идентичной суперклассу.
Тип возвращаемого значения может быть подтипом (covariant return type) в Java 5+.
Модификатор доступа не может быть строже (например, если в супер protected, в подклассе нельзя private, но можно public).
Метод в суперкласса не должен быть final или static (static не переопределяются, а скрываются).
Аннотация
@Override: Рекомендуется добавлять для проверки компилятором — если метод не переопределяет, ошибка.

Нюанс: Переопределение отличается от перегрузки (overloading) — перегрузка: разные сигнатуры в одном классе; переопределение: одинаковые сигнатуры в иерархии.


Ключевое слово super: Доступ к суперклассу

super — это ссылка на суперкласс, аналог this для родителя.

Оно используется для:
Вызова методов суперкласса (super.method()).
Доступа к полям суперкласса (
super.field), если они скрыты.
Вызова конструктора суперкласса (
super(params)).

super полезно, когда в подклассе переопределен метод, но нужно вызвать оригинальную версию из суперкласса.


Подробный пример

Возьмем класс: Animal (суперкласс) и Dog (подкласс).

Суперкласс Animal:
public class Animal {
protected String name;
private int age;

public Animal(String name, int age) {
this.name = name;
this.age = age;
}

public void eat() {
System.out.println(name + " ест пищу.");
}

public int getAge() {
return age;
}
}


Подкласс Dog с переопределением:

public class Dog extends Animal {
private String breed;

public Dog(String name, int age, String breed) {
super(name, age); // Вызов конструктора суперкласса
this.breed = breed;
}

// Переопределение метода eat()
@Override // Аннотация для проверки
public void eat() {
super.eat(); // Вызов версии из суперкласса
System.out.println("Но предпочитает кости!"); // Расширение поведения
}

public void bark() {
System.out.println(name + " лает: Гав!");
}
}

Аннотация @Override: Указывает, что метод переопределен. Если ошибка (например, сигнатура не совпадает) — компилятор предупредит.
super.eat(): Вызывает оригинальный eat() из Animal, затем добавляет свое.
Если убрать super.eat(), метод полностью заменит поведение суперкласса.


Нюанс: Если поле в подклассе скрывает поле суперкласса (field hiding, редко рекомендуется), super.field дает доступ к скрытому.


#Java #для_новичков #beginner #extends #super
👍3
Все нюансы переопределения и super

Сигнатура и совместимость:
Имя, количество/типы параметров должны совпадать точно.
Возврат: Может быть подтипом (например, супер возвращает Animal, под — Dog).
Исключения: Подкласс может бросать меньше или подтипы исключений, но не больше (checked exceptions).


Модификаторы:
Доступ: Может быть шире (protected → public), но не уже (public → protected — ошибка).
Final: Final-методы нельзя переопределять.
Static: Static-методы не переопределяются — это method hiding. Вызов зависит от типа ссылки, не объекта.
Private: Private-методы не видны, так что не переопределяются.


super в конструкторах:
Должен быть первой строкой.
Если не указан, Java вставит
super() без параметров.
Нюанс: В цепочке иерархий (A extends B extends C) конструкторы вызываются сверху вниз: C() →
super(B) → super(A).

super для методов и полей:
super.method(): Вызывает версию суперкласса, даже если переопределен.
Полезно для расширения, а не замены поведения.
Нюанс:
super не работает для static — используйте SuperClass.method().
Field hiding: Если подкласс имеет поле с тем же именем,
super.field дает доступ к суперклассу.

Ошибки компиляции и runtime:
Без @Override: Если сигнатура не совпадает, создастся новый метод (overloading вместо overriding) — неожиданное поведение.
Runtime: Если метод не переопределен правильно, вызовется версия суперкласса.
Abstract методы: Должны быть переопределены в non-abstract подклассах.


Полиморфизм и overriding:
Вызов метода зависит от типа объекта, не ссылки: Animal a = new Dog(); a.eat() — вызовет Dog.eat().
Нюанс: Для полей — наоборот, зависит от типа ссылки (field hiding, не overriding).


Дизайн и лучшие практики:
Переопределяйте только когда нужно изменить поведение.
Используйте
super для композиции поведения.
Избегайте переопределения для радикальных изменений — лучше новый метод.
В больших иерархиях: Документируйте, что можно переопределять.



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

Переопределение метода:
В подклассе Dog: Ctrl+O (Override Methods) → Выберите eat() — IDE добавит @Override и скелет.

Добавьте super:
В сгенерированном методе вставьте super.eat().
Проверка: IDE подскажет ошибки в сигнатуре или доступе.


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

Всегда используйте @Override: Избегайте ошибок.
Тестируйте полиморфно: Создавайте ссылки суперкласса на объекты подкласса и проверяйте вызовы.
super в конструкторах: Не забывайте, если суперкласс требует параметров.
Избегайте field hiding: Лучше разные имена для полей.


#Java #для_новичков #beginner #extends #super
👍5