71 lines
2.7 KiB
Markdown
71 lines
2.7 KiB
Markdown
Краткие правила были описаны в [[Наследование]], сейчас будут примеры
|
|
## Сокрытие поля
|
|
```Java
|
|
class Base {
|
|
protected int protField = 3;
|
|
public int pubField = 4;
|
|
public static int statField = 5;
|
|
}
|
|
|
|
class Extended extends Base {
|
|
protected float protField = 7.0f;
|
|
public float pubField = 8.0f;
|
|
public static int statField = 9;
|
|
|
|
print(this.protField) // 7.0
|
|
print(super.protField) // 3
|
|
print(this.pubField) // 8
|
|
print(super.pubField) // 4
|
|
print(statField) // 9
|
|
print(Base.statFiel) // 5
|
|
}
|
|
|
|
```
|
|
Если имя поля в подклассе и в суперклассе одинаковое
|
|
- Поле подкласса скрывает поле суперкласса
|
|
- Статическое поле суперкласса доступно по имени класса `BaseClass.staticField`
|
|
- Нестатическое поле суперкласса доступно с помощью super: `super.instanceField`
|
|
- Скрытое поле может иметь другой тип
|
|
- Поле может стать `static`, если было не статик. И наоборот
|
|
## Сокрытие метода
|
|
Только для статиков
|
|
```Java
|
|
class Base {
|
|
public int getVal() {
|
|
return 1;
|
|
}
|
|
public static int statVal() {
|
|
return 3;
|
|
}
|
|
}
|
|
|
|
class Ext extends Base {
|
|
public int getVal() {
|
|
return 2;
|
|
}
|
|
public static int statVal() {
|
|
return 4;
|
|
}
|
|
}
|
|
|
|
Base b = new Base();
|
|
Ext e = new Ext();
|
|
Base be = new Ext();
|
|
|
|
print(b.statVal()) // 3
|
|
print(e.statVal()) // 4
|
|
print(be.statVal()) // 3 - по типу ссылки для статики
|
|
|
|
print(b.getVal()) // 1
|
|
print(e.getVal()) // 2
|
|
print(be.getVal()) // 2 - просто переопределение
|
|
|
|
```
|
|
Если [[Функции#Сигнатура|сигнатура]] (имя и параметры) статического метода в подклассе и в суперклассе одинаковая
|
|
- Статический метод подкласса скрывает метод суперкласса
|
|
- Статический метод суперкласса доступен по имени класса `BaseClass.staticMethod()`
|
|
- Модификатор доступа может только расшириться (правило как в [[Переопределение|переопределении]])
|
|
- Возвращаемое значение должно быть ковариантным (тоже как в переопределении)
|
|
- Менять статик на нон-статик и обратно запрещено
|
|
## P.S.
|
|
Сокрытие методов в целом плохая практика, обращаться к статике по объектам - плохой тон |