Вы можете просто определить отдельный метод Subclass.print()
с желаемой реализацией.Статические методы имеют область видимости класса, поэтому каждый подкласс может иметь свою собственную реализацию.
public class Subclass {
public Subclass() {}
public static String print() {
System.out.println(Subclass.class.getSimpleName());
}
public void main(String[] args) {
Super.print();
Subclass.print();
}
}
Обратите внимание, что ваш код может быть несколько упрощен - достаточно Super.class
вместо new Super().getClass()
.
Также обратите внимание, что статические методы не полиморфны -Super.print()
и Subclass.print()
всегда будут вызывать метод в соответствующем классе.Вот почему они привязаны к классу, а не к объекту.
Если у вас большая иерархия классов, вы можете получить много дублирующегося кода, внедрив в каждый отдельный статический print()
.Вместо этого вы можете определить один нестатический метод для выполнения работы:
public abstract class Super {
public final String print() {
System.out.println(this.getClass().getSimpleName());
}
...
}
Обратите внимание, что этот метод даже не должен быть полиморфным - this.getClass()
всегда будет возвращать фактический токен подкласса.
Обратите внимание, что я объявил Super
как abstract
- это (почти всегда) хорошая практика для базовых классов.