Ответ для java одинаков:
Нет никаких причин для открытого конструктора абстрактного класса.Я предполагаю, что причина, по которой компилятор не жалуется, заключается в том, что они просто не тратят время на его освещение, поскольку на самом деле не имеет значения, является ли он открытым или защищенным.( source )
Вы не можете вызывать конструктор абстрактного класса из чего-либо, кроме прямого подкласса.
Таким образом, добавление специального правила для модификаторов доступа конструкторов абстрактных классов не добавит в язык ничего полезного.
Одна вещь, которая выглядитисключение из этого правила - если абстрактный класс определяет только конструктор по умолчанию, то подкласс не должен реализовывать конструктор: это допустимо:
public abstract class A {
public A() {}
}
public class B extends A {}
Таким образом, мы можем создать B
, вызвав new B()
- но обратите внимание, что мы все еще создаем B
, а не A
.И, опять же, не имеет значения, является ли конструктор в A
открытым или защищенным.Он просто не должен быть закрытым, но компилятор заметит и пожалуется ...
На самом деле мы вызываем "невидимый" публичный конструктор по умолчанию для B
, который выполняет простой super()
вызов ...