52 lines
2.2 KiB
Markdown
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` - компилятор проверит, правильно ли вы переопределяете метод (сигнатуру, модификаторы) |