Конструктор в дочернем классе

Зачем нужен конструктор в B? IntelliJ предлагает удалить =null, так как он предположительно избыточен, потому что он инициализируется через данный конструктор в A. Однако это удаление (которое предположительно также выполняется компилятором) затем (предположительно) требует конструктора в B.

Любое другое объяснение?

public abstract class A {
  private Object foo = null;
  public A(Object foo){this.foo=foo;}
}

public class B extends A {
  public B(Object foo){super(foo);}
}

Если у B нет конструктора, как вы можете вызвать конструктор родительского класса?

m0skit0 11.12.2020 10:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
603
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Зачем нужен конструктор в B?

Если class B extends A, то class B должен быть создан всеми возможными способами, поскольку class A может быть, а class B может иметь дополнительные способы создания экземпляра. Это означает, что class B вынужден иметь конструктор.

Единственное исключение может быть в случае конструктора без аргументов, потому что компилятор создает его с помощью конструктора по умолчанию, то есть, если вы помещаете конструктор без аргументов в class A, дочерние классы не обязаны иметь это.

Потребность в конструкторе в B была бы такой же, если бы A не был abstract, поэтому объяснение несколько вводит в заблуждение.

Gyro Gearless 11.12.2020 10:50
Ответ принят как подходящий

В Java нет «наследования конструктора». Единственный способ инициализировать A — передать параметр foo его конструктору, и единственный способ сделать это — создать конструктор для B, который делает это.

Обратите внимание, однако, что они не должны иметь одинаковую подпись (как у вас в вопросе) - конструктору B нужно только передать какой-то параметр в A. Например.:

public class B extends A {
    public B() {
        super("Arbitrary default passed to A");
    }

    public B(Object passedToA, Obejct notPassedToA) {
        super(passedToA);
        System.out.println("This argument was not passed to A():" + notPassedToA);
    }
}

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