请考虑以下代码段:
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初始化非静态成员(根据我提到的顺序).
但结果是“B.m()”. (已经执行了子类的方法)
考虑到我提到的顺序,有人可以解释这里发生的事情(方法覆盖)吗?