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);
}
}
当我创建一个具有两个构造函数的子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);
}
}