没有"this()"函数的子类如何识别父类中的实例变量?



如果:

  1. 在Fly类构造函数中没有调用super()函数
  2. '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)。

最新更新