Сначала рассмотрим типичный пример проблемы. Представим себе, что есть класс Animal
, который имеет метод sound()
. Этот класс имеет подкласс Cat
, который переопределяет метод sound()
. Также у класса Cat
есть подкласс Lion
, который также переопределяет метод sound()
.
class Animal { void sound() { System.out.println("Animal is making a sound"); } } class Cat extends Animal { @Override void sound() { System.out.println("Cat is meowing"); } } class Lion extends Cat { @Override void sound() { System.out.println("Lion is roaring"); } }
В данном случае, если создать объект класса Lion
и вызвать метод sound()
, то будет выведено «Lion is roaring». Если же в классе Lion
использовать super.sound()
, то будет выведено «Cat is meowing», так как вызывается переопределенный метод родительского класса Cat
. Но что, если в классе Lion
требуется вызвать метод sound()
из класса Animal
? Многие новички думают, что можно использовать super.super.sound()
, чтобы вызвать метод sound()
из класса Animal
, но это не работает в Java.
class Lion extends Cat { @Override void sound() { super.super.sound(); // Компилятор выдаст ошибку } }
Java не поддерживает super.super.method()
, потому что это нарушает инкапсуляцию. Каждый подкласс отвечает за свою реализацию и не должен знать об устройстве его суперклассов. Если бы super.super.method()
было разрешено, подкласс мог бы «перепрыгнуть» через реализацию своего непосредственного суперкласса и изменить поведение, которое суперкласс пытался обеспечить. Это могло бы привести к непредсказуемым и нежелательным результатам.
В других языках программирования, таких как C++, где множественное наследование допускается, вызов методов более высокого уровня в иерархии классов является возможным. Однако Java была специально разработана с целью предотвращения такого рода ситуаций, в целях обеспечения безопасности и сохранения простоты языка.
Если есть необходимость вызвать метод из более высокого класса в иерархии, то это, возможно, свидетельствует о том, что структура классов и их наследование требует пересмотра.
Добавить комментарий