考虑以下代码段:
class A{ /* assume static and non static block are here */ }
class B extends A{ /* assume static and non static block are here */ }
在主要方法中,
new B();
所以初始化的顺序是:
- 类 A 的静态成员初始化
- B类的静态成员初始化
- 类 A 的非静态成员初始化
- 然后执行构造函数 A 中的代码
- B类的非静态成员初始化
- 然后执行构造函数 B 中的代码
现在看一下这段代码,
class A{
A(){
this.m(); //line 1
}
void m(){
System.out.println("A.m()");
}
}
class B extends A{
void m(){
System.out.println("B.m()");
}
}
在主要方法中,
new B();
在执行构造函数 A 的代码时,它只能看到类 A 中的方法 m,因为尚未为类 B 初始化非静态成员(根据我提到的顺序)。然而结果是“Bm()”。(子类的方法已执行)考虑到我提到的顺序,有人可以解释这里发生了什么(方法覆盖)吗?