Если в классе A не объявлен ни один конструктор, то он по умолчанию содержит конструктор без параметров - A(), однако, если объявлен хотя бы один конструктор с параметрами, то конструктор A() исчезает. Но исчезает он только тогда, когда явно не объявлен.
Примеры
//содержит неявно 1 конструктор A()
class A{
}
//тоже содержит конструктор A() но явно
class A{
A(){
}
}
//cодержит СОДЕРЖИТ ТОЛЬКО 1 конструктор, конструктора A() уже нет
class A{
A(int x){
}
}
//есть оба конструктора
class A{
A(int x){
}
A(){}
}
В примере класс A содержит один конструктор с параметром - A(int x), это значит, что он не имеет конструктора A(), и его нужно (при необходимости) определить самому.
Механизм наследования таков:
- мы хотим создать объект B, вызвав конструктор B(int b)
- первой строкой конструктора должна быть строка super(...) - с параметрами или без, это нужно для того чтобы сначала сконструировался родитель, ведь B унаследован от A
- если первая строка другая, то компилятор подставляет конструктор родителя без параметров - super(), в этом случае будет вызвано создание объекта A с помощью конструктора A().
- но так как в объекте A не определен этот конструктор - вылетает ошибка
Можно исправить так
Либо добавить в объект A конструктор A(), либо в конструктор объекта B, добавить явный вызов конструктор родителя super(int x) ( в данном случае у родителя есть только 1 конструктор - A(int x)