Java 子类的构造函数

Java Constructor of a Subclass

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

此外,如果我只是忽略使用 super 并将字段分配给参数(如 this.fieldName=parameterName),我会收到错误 "there is no default constructor in super" 为什么我得到这个即使 super class 有构造函数吗?

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;
    }
}

If constructor in super class has parameters a,b,c like MySuperClass(int a, string b, string c). And the constructor in the subclass has parameters a,d,e like MySubClass(int a, int d, int e), what should go inside the constructor of the subclass?

您是唯一做出此决定的人,因为这取决于数字对您的业务案例的意义。只要是没有语义的数字就无所谓了。

Can I say super(a) so I don't have to duplicate the code for parameter a?

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

why do I get this even though the super class has a constructor?

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

And how can I solve this issue?

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