我有一个继承超类的子类。如果超类中的构造函数有参数a,b,c,如MySuperClass(int a, string b, string c)
。子类中的构造函数有参数a,d,e,像MySubClass(int a, int d, int e)
一样,子类的构造函数里面应该包含什么?我可以说super(a)
,这样我就不必复制参数a的代码了吗?但是super的构造函数有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);
}
}
构造函数总是做的第一件事就是调用它的父类的构造函数。省略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, string b, string c),而子类中的构造函数有参数a,d,e,如MySubClass(int a, int d, int e),那么子类的构造函数中应该包含什么?
你是唯一一个做出这个决定的人,因为这取决于这些数字对你的商业案例意味着什么。只要它们只是数字,没有任何语义意义就没关系。
我可以写super(a)这样我就不用重复参数a的代码了吗?
不,你必须指定哪些类的构造函数参数或常量应该传递给父类的构造函数。同样,没有"自动"的解决方案。作为程序员,你有责任决定将哪些值传递给超类构造函数,以及这些值来自哪里。
为什么我得到这个,即使超类有一个构造函数?
超类构造函数不是默认构造函数(没有参数)。
我该如何解决这个问题?
同样没有一般的答案。通常唯一有效的方法是提供传递给超类构造函数的值。在非常罕见的情况下,可能需要创建一个额外的默认构造函数。