Java конструктор подкласса
У меня есть подкласс, расширяющий суперкласс. Если конструктор в суперклассе имеет параметры a, b, c MySuperClass(int a, string b, string c)
, И конструктор в подклассе имеет параметры a, d, e, как MySubClass(int a, int d, int e)
что должно идти внутри конструктора подкласса? Могу ли я сказать super(a)
поэтому мне не нужно дублировать код для параметра а? но конструктор супер имеет 3 параметра; так что я думаю, что не могу этого сделать.
Кроме того, если я просто игнорирую использование super и назначаю поля параметрам (например, this.fieldName=parameterName
) Я получил бы ошибку, что "в super нет конструктора по умолчанию", почему я получаю это, даже если у суперкласса есть конструктор?
public abstract class Question {
// The maximum mark that a user can get for a right answer to this question.
protected double maxMark;
// The question string for the question.
protected String questionString;
// REQUIRES: maxMark must be >=0
// EFFECTS: constructs a question with given maximum mark and question statement
public Question(double maxMark, String questionString) {
assert (maxMark > 0);
this.maxMark = maxMark;
this.questionString = questionString;
}
}
public class MultiplicationQuestion extends Question{
// constructor
// REQUIRES: maxMark >= 0
// EFFECTS: constructs a multiplication question with the given maximum
// mark and the factors of the multiplication.
public MultiplicationQuestion(double maxMark, int factor1, int factor2){
super(maxMark);
}
}
2 ответа
Первое, что всегда делает конструктор, это вызывает конструктор своего суперкласса. Опуская super
вызов не обходит это - это просто синтаксический сахар, который избавляет вас от необходимости указывать super()
(то есть, вызывая конструктор по умолчанию) явно.
Что вы можете сделать, это передать какое-то значение по умолчанию конструктору суперкласса. Например:
public class SubClass {
private int d;
private int e;
public SubClass(int a, int d, int e) {
super(a, null, null);
this.d = d;
this.e = e;
}
}
Если конструктор в суперклассе имеет параметры a,b,c, такие как MySuperClass (int a, строка b, строка c). И у конструктора в подклассе есть параметры a,d,e, такие как MySubClass(int a, int d, int e), что должно идти внутри конструктора подкласса?
Вы единственный, кто принимает это решение, потому что это зависит от того, что цифры означают для вашего бизнеса. Пока это просто числа без какого-либо семантического значения, это не имеет значения.
Могу ли я сказать super(a), чтобы мне не пришлось дублировать код для параметра a?
Нет, вы должны указать, какой из параметров или констант классов должен быть передан в конструктор суперкласса. Опять не существует "автоматического" решения. Как программист, вы должны решить, какие значения передаются конструктору суперкласса и откуда они берутся.
почему я получаю это, хотя у суперкласса есть конструктор?
конструктор суперклассов не является конструктором по умолчанию (который не имеет параметров).
И как я могу решить эту проблему?
Еще раз это не имеет общего ответа. Обычно единственный допустимый способ - предоставить значения для передачи конструктору суперклассов. В очень редких случаях может быть целесообразно создать дополнительный конструктор по умолчанию.