如果:
- 在Fly类构造函数中没有调用super()函数
- 'x'变量未在Super类构造函数中初始化
public class Super {
protected int x = 1;
public Super() {
System.out.print("Super");
}
}
public class Duper extends Super {
protected int y = 2;
public Duper() {
System.out.println(" duper");
}
}
public class Fly extends Super {
private int z, y;
public Fly() {
}
public Fly(int n) {
z = x + y + n;
System.out.println(" fly times " + z);
}
public static void main(String[] args) {
Duper d = new Duper();
int delta = 1;
Fly f = new Fly(delta);
}
}
我认为为了让Fly类在Super类中接收'x'变量,我们必须在Fly类构造函数中使用Super()函数调用它。然而,为了做到这一点,我们需要x是一个形式参数,如下所示:
public class Super {
protected int x = 1;
public Super(**int x**){
**this.x = x**;
public super(){
x =1;
}
System.out.print("Super");
}
}
public class Fly extends Super {
private int z, y;
public Fly() {
}
public Fly(int n) {
**super(x)**
z = x + y + n;
System.out.println(" fly times " + z);
}
换句话说,如果在父类中没有调用父类(x),那么如何在fly类构造函数中定义fly中的"x"值?当我调用Fly()时,它运行。我认为Fly()构造函数中的'x'变量是未定义的。
如果你不显式调用一个超级构造函数,那么调用一个不带参数的超级构造函数(即super()调用super())。
如果您不显式初始化一个字段,它将初始化为默认值(0
用于数字,false
用于布尔值,null
用于引用)。
在Java中,子类的构造函数的第一行总是有一个隐式的super()
。
除此之外,x
总是由超类初始化,因为它在声明期间初始化,而不是在构造函数中初始化。而且,即使您简单地将成员声明为protected int x;
,它也会被分配一个默认值(0
)。