Краткие правила были описаны в [[Наследование]], сейчас будут примеры ## Сокрытие поля ```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. Сокрытие методов в целом плохая практика, обращаться к статике по объектам - плохой тон