当我创建一个有两个构造函数的子类时,我需要定义一个构造函数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);
}
}
答案 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);
}
}