Вы могли бы спроектировать это немного по-другому, чтобы усилить поведение:
Суперкласс должен быть абстрактным или, по крайней мере, определять метод final. Затем определите защищенный метод, который должен реализовать подкласс, и, наконец, суперкласс вызовет метод после завершения любого кода, который должен быть выполнен заранее:
public abstract class SuperClass {
// final so it can't be overriden
public final void superMethod() {
// required code here
// then delegate to implMethod
implMethod();
}
protected abstract() void implMethod();
}
public class SubClasss extends SuperClass {
protected void implMethod() {
// sub class logic
}
}
Конечно, SuperClass не должен быть абстрактным, вы можете реализовать implMethod, а затем позволить подклассам переопределять его