#java #inheritance #constructor #extends #super
#java #наследование #конструктор #расширяет #супер
Вопрос:
Я изучаю ключевое слово super и случайно получаю это, вот пример :
public class A {
double a;
public A (double a) {
this.a = a;
}
}
public class B extends A {
public B (double b) {
super.a = b; //***
}
}
Обычный способ сделать это, как в руководствах, — super(b)
повторно использовать его родительский конструктор, но что не так super.a = b
?
Ответ №1:
В Java нет «наследования конструктора». Если у суперкласса нет конструктора без аргументов, вы должны явно вызвать его конструктор (или один из них, если их несколько). Если вы этого не сделаете, вы получите ошибку компиляции.
Ответ №2:
Когда вы пишете свой класс A следующим образом:
public class A {
double a;
public A(double a) {
this.a = a;
}
}
вы перезаписываете конструктор по умолчанию и в строке this.a = a
получаете доступ к переменной экземпляра и устанавливаете значения и в классе B:
public class B extends A {
public B(double b) {
super.a = b; // ***
}
}
вы пытаетесь получить доступ к переменным экземпляра класса B через конструктор, потому что super.a
здесь супер ссылается на конструктор и его неправильно и выдает, Implicit super constructor A() is undefined. Must explicitly invoke another constructor
что означает: в классе B
он ищет конструктор, у которого нет параметра, потому что вы перезаписываете конструктор класса по умолчанию, и он не может распознать его, вызвав super.a = b
soвы должны вызвать суперконструктор как функцию и в первой строке кода:
public class B extends A {
public B(double b) {
super(b);
super.a = b; // ***
}
}