Files
obsidian/Программирование на Java/ООП/Наследование/Переопределение.md
T
roma-dxunvrs 0e6e583e6d
deploy / Pull and Restart (push) Successful in 17s
refactor: wiki links -> md links
2026-09-22 08:52:23 +03:00

63 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Переопределение методов:
- Создание в подклассе методов с тем же именем и набором параметров, как в суперклассе
- Меняется поведение наследника - не должен нарушаться контракт базового класса
- Метод наследника имеет то же имя и тот же набор параметров
- Меняется поведение наследника
Не путать с [перегрузкой](../Полиморфизм/Ad-hoc%20(перегрузка).md)
## Модификатор доступа при переопределении
Модификатор доступа можно только расширять, сужать - нет
Например, `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
}
```
## Сигнатура метода при переопределении
[](../../Синтаксис%20и%20типы/Работа%20с%20данными%20и%20типами/Функции.md#Сигнатура|Сигнатура) должна совпадать, при этом имена параметров, как и положено, могут быть изменены
## Аннотация @Override
При переопределении можно использовать аннотацию `@Override` - компилятор проверит, правильно ли вы переопределяете метод (сигнатуру, модификаторы)
## Тип ошибки при переопределении
Если родительский метод выбрасывал [ошибку](../../Исключения/Система%20исключений.md) через `throws`, то в переопределяемом методе можно сужать тип ошибки (указывать наследников)
```Java
class A {
protected void method() throws Exception {}
}
class B extends A {
@Override
public void method() throws IOException {}
}
```