Сокрытие метода в Java (method hiding)

Сокрытие метода в 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
}
}

Объяснение

  1. Статические методы:
    • Когда вызывается superClass.staticMethod(), вызывается статический метод из SuperClass.
    • Когда вызывается subClassAsSuper.staticMethod(), вызывается статический метод из SuperClass, потому что тип ссылки – SuperClass.
    • Когда вызывается subClass.staticMethod(), вызывается статический метод из SubClass, потому что тип ссылки – SubClass.
  2. Нестатические методы:
    • Когда вызывается superClass.instanceMethod(), вызывается метод из SuperClass.
    • Когда вызывается subClassAsSuper.instanceMethod(), вызывается метод из SubClass, потому что метод переопределён и поведение определяется типом объекта во время выполнения.
    • Когда вызывается subClass.instanceMethod(), вызывается метод из SubClass.

Таким образом, сокрытие методов работает по-разному для статических и нестатических методов, и важно понимать это различие при проектировании классов и методов в Java.

Каталог и рейтинг онлайн-курсов программирования Джава
Logo