63 lines
2.8 KiB
Markdown
63 lines
2.8 KiB
Markdown
Переопределение методов:
|
||
- Создание в подклассе методов с тем же именем и набором параметров, как в суперклассе
|
||
- Меняется поведение наследника - не должен нарушаться контракт базового класса
|
||
- Метод наследника имеет то же имя и тот же набор параметров
|
||
- Меняется поведение наследника
|
||
Не путать с [перегрузкой](../Полиморфизм/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 {}
|
||
}
|
||
``` |