如果创建了子类的实例,则输出为 sub0 sub2
两个问题:
为什么即使超类构造函数没有完成,也会调用子类方法?
为什么从超类构造函数(sub0输出)调用时,实例字段未初始化?
例:
class Superclass{
int i = 1;
Superclass(){
aMethod();
}
void aMethod(){
System.out.println("super" + i);
}
}
class Subclass extends Superclass{
int i = 2;
Subclass(){
aMethod();
}
void aMethod(){
System.out.println("sub" + i);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么即使超类构造函数没有完成,也会调用子类方法?
因为已经在那个时间点创建了子类的实例.刚刚调用超类构造函数来初始化对象的状态.现在,因为实例实际上是子类的实例(我假设你只讨论这种情况),所调用的实际方法将是重写的方法(此处适用的方法覆盖规则).
为什么在从超类构造函数(sub0输出)调用时,实例字段未初始化?
因为,子类构造函数尚未启动初始化部分.它是首先执行的超类构造函数.因此,如果从超类构造函数调用子类中的重写方法,则子类的字段尚未初始化且值i仍为0.
也可以看看:
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |