У меня есть объект подкласса, расширяющего его суперкласс. Существует переопределенный метод в подклассе, который можно назвать с помощью объекта. Это возможно назвать функциональное использование суперкласса объекта подкласса?
package supercall;
public class Main {
public static void main(String[] args) {
SomeClass obj = new SubClass();
obj.go(); //is there anything like, obj.super.go()?
}
}
class SomeClass {
SomeClass() {
}
public void go() {
System.out.println("Someclass go");
}
}
class SubClass extends SomeClass {
SubClass() {
}
@Override
public void go() {
System.out.println("Subclass go");
}
}
Рассмотрите код выше.
Здесь это печатает
Подкласс идет
. Вместо этого я должен распечатать
Суперкласс идет
.
Нет, это невозможно, и если вы думаете, что вам это нужно, переосмыслите свой дизайн. Весь смысл переопределения метода в том, чтобы заменить его функциональность. Если другой класс знает так много о внутренней работе этого класса, вы полностью убиваете инкапсуляцию.
Вместо:
System.out.println("Subclass go");
Напишите
super.go();
(Или, знаете, просто не реализуйте этот метод ...).
Один из способов - заставить подкласс вызывать реализацию суперкласса. Но я предполагаю, что это не то, что вам нужно?
class SubClass extends SomeClass {
SubClass() {}
@Override
public void go() {
super.go
}
}
Есть ли способ добиться этого? Нет, нет.
Во время выполнения JVM будет выбирать методы для вызова на основе типа экземпляра (для вас это полиморфизм), а не на основе типа, с которым он объявлен.
Ваш экземпляр является экземпляром подкласса, поэтому будет вызван метод go () в подклассе.