Я думал, что понял, что делает супер, однако я не могу понять, почему в следующем коде
class test {
int i;
test(int i){
this.i = i;
}
}
class testSub extends test{
testSub(int i) {
super(i);
}
/*testSub(int i) {
this.i = i;
}*/
}
почему бы второй конструктор (заработал) работать? он делает то же самое..
Спасибо за любые разъяснения :)
EDIT: Спасибо всем - извините, я не могу отметить больше ответов. Также жаль, если это не должно быть правкой.
Быстрое повторение: поскольку testSub является дочерним элементом родительского теста, хотя конструктор делает то же самое, ребенок должен состоять из его родительской части. Только если у теста был конструктор по умолчанию, это было бы возможно. Если я не понял это правильно, ответьте.
Выполнение того же самого - это не то же самое, что быть одним и тем же. Компилятор не собирается проверять, что вы позаботились о том, что супер должно делать. Это просто будет настаивать на том, что вы называете это, когда это требуется.
У вашего test
класса есть явный конструктор. Вы должны использовать этот конструктор в конструкторе каждого подкласса.
Если у test
не было явного конструктора, будет создан неявный конструктор без аргументов, и вам не придется явно ссылаться на него в подклассе. В этой ситуации ваш второй конструктор будет абсолютно прав.
class test {
int i;
}
class testSub extends test{
testSub(int i) {
this.i = i;
}
}
Конструктор вашего класса всегда будет вызывать один из конструкторов суперкласса.
Вы можете сделать вызов явным с super
(первая инструкция конструктора), и в этом случае вы можете выбрать, какой конструктор вы вызовете.
Если вы явно не используете super
, он попытается использовать конструктор по умолчанию (без параметров). Но ваш суперкласс не имеет его, поэтому он не сможет скомпилировать.
Самое простое решение - явно объявить конструктор без параметров в вашем суперклассе. Тем не менее, всегда лучше использовать родительские методы, когда это возможно, поэтому, если в итоге результат будет таким же, он будет более изящным, используя super(i)
.
Как ясно говорит вам ошибка, вы должны вызвать конструктор базового класса, или базовый класс не будет создан.
Выполнять то же, что и конструктор базового класса, недостаточно; вы действительно должны это назвать.
Если базовый класс имеет конструктор без параметров (например, конструктор по умолчанию, если вы его не пишете), вы можете его оставить, и компилятор автоматически вызовет его.
test
не предоставляет конструктор без параметров.