java 中 super 和 sub 类 之间的构造函数

constructors between super and sub classes in java

当我创建一个具有两个构造函数的子class时,我需要定义一个构造函数SuperClass(int m),因为子class中的第二个构造函数正在调用它super().这是我理解的部分。但是代码不会编译,除非我在 SuperClass 中定义另一个构造函数,比如 SuperClass(){},而不是 SuperClass(int m, int n){}。为什么?

public class SubClass extends SuperClass {

    int i,j,k;
    public SubClass(int m, int n){
        this.i = m;
        this.j=n;
    }
    public SubClass(int m){
        super(m);
    }
}

您的一个子类构造函数没有调用超类的构造函数class。如果您不指定超级构造函数,JDK 将采用默认构造函数。如果 super class 没有默认构造函数则无法编译。

public SubClass(int m, int n){
    this.i = m;
    this.j=n;
}

在上面的构造函数中暗示存在超级 class 无参数构造函数。等同于:

public SubClass(int m, int n){
    super(); // This was implied.
    this.i = m;
    this.j=n;
}

另一种情况是这样的:

public SubClass(int m){
    super(m);
}

在这里你声明你正在使用一个超级class构造函数,它接受一个参数m

所以,基本上你的超级 class 必须声明两个构造函数才能使代码工作:

SuperClass() {
    // The default constructor
}

SuperClass(int m) {
    // one arg constructor...
}

但是,如果指定以下超级 class 构造函数:

SuperClass(int m, int n){}

然后你可以像这样重写你的子 class 构造函数:

public SubClass(int m, int n){
    super(m, n);
}

This article from Oracle很好的解释了构造函数的用法!

在 java 中,当您显式定义任何构造函数到 class 时。默认构造函数不再可用,您需要重新定义默认构造函数。

并且在 subclass 的构造函数中,默认情况下第一个隐式语句将是 super() 以防您没有显式调用任何其他超级构造函数

public class SubClass extends SuperClass {

    int i,j,k;
    public SubClass(int m, int n){
        super() //implicit
        this.i = m;
        this.j=n;
    }
    public SubClass(int m){
        super(m);
    }
}