Files
obsidian/Программирование на Java/ООП/Наследование/Переопределение.md
T
roma-dxunvrs f57762fd3b Init
2026-09-03 21:40:46 +03:00

52 lines
2.2 KiB
Markdown

Переопределение методов:
- Создание в подклассе методов с тем же именем и набором параметров, как в суперклассе
- Меняется поведение наследника - не должен нарушаться контракт базового класса
- Метод наследника имеет то же имя и тот же набор параметров
- Меняется поведение наследника
Не путать с [[Ad-hoc (перегрузка)|перегрузкой]]
## Модификатор доступа при переопределении
Модификатор доступа можно только расширять, сужать - нет
Например, `default -> public` или `private -> public`
```Java
class Base {
protected int getVal() {
return 1;
}
protected static int statVal() {
return 3;
}
}
class Ext extends Base {
private int getVal() {
return 2;
}
private static int statVal() {
return 4;
}
}
```
>[!danger] Error:
getVal() in Ext cannot override getVal() in Base
attempting to assign weaker access privileges; was protected
## Тип возвращаемого значения при переопределении
Тип возвращаемого значения тоже можно менять, он должен быть ковариантен исходному (то есть быть таким же, либо потомком)
```Java
class B {}
class D extends B {}
class A {
B method() {}
}
class C extends A {
@Override
D method() {} // OK
@Override
void method() {} // ERROR
}
```
## Сигнатура метода при переопределении
[[Функции#Сигнатура|Сигнатура]] должна совпадать, при этом имена параметров, как и положено, могут быть изменены
## Аннотация @Override
При переопределении можно использовать аннотацию `@Override` - компилятор проверит, правильно ли вы переопределяете метод (сигнатуру, модификаторы)