java中超类和子类之间的构造函数

时间:2015-01-17 19:22:02

标签: java constructor

当我创建一个有两个构造函数的子类时,我需要定义一个构造函数SuperClass(int m),因为我的子类中的第二个构造函数正在调用它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);
    }
}

3 个答案:

答案 0 :(得分:3)

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

在上面的构造函数中,隐含了一个超类no-args构造函数。它与:

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

另一种情况是:

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

在这里,您声明您正在使用一个带有一个参数m的超类构造函数。

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

SuperClass() {
    // The default constructor
}

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

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

SuperClass(int m, int n){}

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

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

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

答案 1 :(得分:1)

您的一个SubClass构造函数不会调用超类的构造函数。如果未指定超级构造函数,则JDK将采用默认构造函数。如果超类没有默认构造函数,那么它就无法编译。

答案 2 :(得分:0)

在java中明确定义类的任何构造函数时。默认构造函数不再可用,您需要再次定义默认构造函数。

在子类的构造函数中,默认情况下,如果您没有显式调用任何其他超级构造函数,则第一个隐式语句将为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);
    }
}