子类的Java构造函数

子类的Java构造函数,java,inheritance,constructor,super,mappedsuperclass,Java,Inheritance,Constructor,Super,Mappedsuperclass,我有一个子类扩展了一个超类。如果超类中的构造函数具有参数a,b,c,如MySuperClass(int a,string b,string c)。子类中的构造函数有参数a,d,e,就像MySubClass(inta,intd,inte),子类的构造函数中应该包含什么?我可以说super(a),这样就不必为参数a复制代码了吗?但super的构造函数有3个参数;所以我想我不能这么做 另外,如果我只是忽略使用super并将字段分配给参数(比如this.fieldName=parameterName),

我有一个子类扩展了一个超类。如果超类中的构造函数具有参数a,b,c,如
MySuperClass(int a,string b,string c)
。子类中的构造函数有参数a,d,e,就像
MySubClass(inta,intd,inte)
,子类的构造函数中应该包含什么?我可以说
super(a)
,这样就不必为参数a复制代码了吗?但super的构造函数有3个参数;所以我想我不能这么做

另外,如果我只是忽略使用super并将字段分配给参数(比如
this.fieldName=parameterName
),我会得到一个错误,即“super中没有默认构造函数”,为什么即使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、字符串b、字符串c)。子类中的构造函数有参数a,d,e,比如MySubClass(inta,intd,inte),子类的构造函数中应该包含什么

你是唯一做出这个决定的人,因为这取决于这些数字对你的商业案例意味着什么。只要它们只是没有任何语义意义的数字,那就没关系了

我可以说super(a)吗,这样我就不必重复参数a的代码了

不,您必须指定哪些类构造函数参数或常量应传递给超类的构造函数。同样,没有“自动”解决方案。作为程序员,您有责任决定将哪些值传递给超类构造函数以及它们来自何处

为什么即使超级类有一个构造函数,我也会得到这个呢

超级类构造函数不是默认构造函数(没有参数)

我怎样才能解决这个问题


这再一次没有一般的答案。通常唯一有效的方法是提供传递给超级类构造函数的值。在极少数情况下,可能适合创建一个额外的默认构造函数

你能添加你的代码吗?这个答案将帮助你根据你想做的事情来建模构造函数。你可以用
“+b
字符串将
int
转换成字符串。valueOf(b)