次のコード セグメントを検討してください。
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 のコードが実行されているとき、非静的メンバーはクラス B に対してまだ初期化されていないため (前述の順序に従って)、クラス A のメソッド m しか表示されません。ただし、結果は「Bm()」です。(サブクラスのメソッドが実行されました)誰かが私が言及した順序を考慮して、ここで何が起こっているのか(メソッドのオーバーライド)を説明できますか?