Сокрытие метода в Java (method hiding) относится к ситуации, когда статический метод в подклассе имеет такое же имя и параметры, что и статический метод в суперклассе. В таком случае метод из суперкласса “скрывается” методом из подкласса. Hiding отличается от переопределения методов, так как скрываются только статические методы, в то время как переопределяются нестатические методы.
При сокрытии методов поведение вызываемого метода определяется типом ссылки (типа класса) во время компиляции, а не типом объекта во время выполнения.
Пример
Рассмотрим пример, чтобы понять сокрытие метода:
class SuperClass {
static void staticMethod() {
System.out.println("Static method in SuperClass");
}
void instanceMethod() {
System.out.println("Instance method in SuperClass");
}
}
class SubClass extends SuperClass {
static void staticMethod() {
System.out.println("Static method in SubClass");
}
@Override
void instanceMethod() {
System.out.println("Instance method in SubClass");
}
}
public class MethodHidingExample {
public static void main(String[] args) {
SuperClass superClass = new SuperClass();
SuperClass subClassAsSuper = new SubClass();
SubClass subClass = new SubClass();
// Вызов статических методов
superClass.staticMethod(); // Output: Static method in SuperClass
subClassAsSuper.staticMethod(); // Output: Static method in SuperClass (метод скрыт)
subClass.staticMethod(); // Output: Static method in SubClass
// Вызов нестатических методов
superClass.instanceMethod(); // Output: Instance method in SuperClass
subClassAsSuper.instanceMethod(); // Output: Instance method in SubClass (метод переопределён)
subClass.instanceMethod(); // Output: Instance method in SubClass
}
}
Объяснение
- Статические методы:
- Когда вызывается
superClass.staticMethod()
, вызывается статический метод изSuperClass
. - Когда вызывается
subClassAsSuper.staticMethod()
, вызывается статический метод изSuperClass
, потому что тип ссылки –SuperClass
. - Когда вызывается
subClass.staticMethod()
, вызывается статический метод изSubClass
, потому что тип ссылки –SubClass
.
- Когда вызывается
- Нестатические методы:
- Когда вызывается
superClass.instanceMethod()
, вызывается метод изSuperClass
. - Когда вызывается
subClassAsSuper.instanceMethod()
, вызывается метод изSubClass
, потому что метод переопределён и поведение определяется типом объекта во время выполнения. - Когда вызывается
subClass.instanceMethod()
, вызывается метод изSubClass
.
- Когда вызывается
Таким образом, сокрытие методов работает по-разному для статических и нестатических методов, и важно понимать это различие при проектировании классов и методов в Java.