Не могли бы вы переопределить метод абстрактного суперкласса, определив его в подклассе как абстрактный метод в Java?

Это может показаться глупым вопросом, но я действительно долгое время изо всех сил пытался найти ответ самостоятельно. Так возможно ли это?

Например:

public class SuperClass {
  public void methodToOverride(){
      System.out.println("Some text");
  }  
}

public class SubClass extends SuperClass{
  abstract void methodToOverride();
}

Он компилируется и работает нормально?

achAmháin 16.10.2018 19:49

Да, и проблема в том, что у меня нет логического ответа, почему?

Filip Dirk 16.10.2018 19:58

Было бы больше смысла, если бы вы добавили аннотацию @Override над подписью abstract void methodToOverride();?

Jacob G. 16.10.2018 20:02

Это прямо здесь, в спецификация языка: «Метод экземпляра, который не является абстрактным, может быть переопределен абстрактным методом».

Andy Turner 16.10.2018 21:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы он заработал, вам потребуется всего лишь несколько настроек. Прежде всего, подкласс должен быть абстрактным, чтобы иметь абстрактные методы.

Во-вторых, метод methodToOverride не может иметь меньшую видимость, чем его родительский, поэтому вы должны сделать его общедоступным.

Затем он должен скомпилироваться и запуститься должным образом. Вот пример:

public class SuperClass {
    public void methodToOverride(){
        System.out.println("Some text");
    }
}

public abstract class SubClass extends SuperClass{
    public abstract void methodToOverride();
}

public class OtherClass extends SubClass {
    @Override
    public void methodToOverride() {
        // new logic
    }
}

При этом, конечно, странное моделирование ...

Надеюсь, это поможет!

Другие вопросы по теме