Зачем нужен конструктор в 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?
Если class B extends A, то class B должен быть создан всеми возможными способами, поскольку class A может быть, а class B может иметь дополнительные способы создания экземпляра. Это означает, что class B вынужден иметь конструктор.
Единственное исключение может быть в случае конструктора без аргументов, потому что компилятор создает его с помощью конструктора по умолчанию, то есть, если вы помещаете конструктор без аргументов в class A, дочерние классы не обязаны иметь это.
Потребность в конструкторе в B была бы такой же, если бы A не был abstract, поэтому объяснение несколько вводит в заблуждение.
В 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);
}
}
Если у B нет конструктора, как вы можете вызвать конструктор родительского класса?