インスタンス制御フローと静的制御フローをいじっています。以下のコードに注目してください。
class A {
{
m1();
}
A(){
System.out.println("A constructor");
}
void m1(){
System.out.println("A m1");
}
}
public class Main extends A {
public static void main(String[] args) throws Exception {
Main m = new Main();
}
void m1(){
System.out.println("Main m1");
}
}
コードの出力は次のとおりです。
Main m1
コンストラクタ
私が知っている理由は次のとおりです。
まず、静的ブロックと変数は、上から下の親から子へと識別されましたmain()
。
次に、静的ブロックと変数の割り当てが実行されるため、main()
の実行が開始され、新しいMain
オブジェクトの作成が試行されます。
3番目に、親クラスのインスタンスブロックと変数が識別されます。次に、それらは上から下に実行されます。(その後、親クラスのコンストラクターが実行され、次に子クラスのインスタンス ブロックと変数が識別され、続いてそれらが上から下に実行され、最後に子クラスのコンストラクターが実行されます)。
というわけで、A 内のインスタンス ブロックは、`m1()` を呼び出します。次に、A のコンストラクターが実行されます。最後に、制御フローを main() に戻し、プログラムを終了します。
さて、A からの m1() の呼び出しは Main の m1() を呼び出す。しかし、両方の `m1()` メソッドを静的にし、他はすべてそのままにしておけば、A のインスタンス ブロックから `m1()` を呼び出すと、A の `m1()` が呼び出されます。
2 つの質問があります (なぜですか? 純粋に学術的な理由で、私はまだ Java を学んでいます):
- 両方の
m1()
メソッドが静的でない場合、A のインスタンス ブロックから A の m1() を呼び出すことは可能ですか? やってみましたthis.m1()
が、それでも Main の m1() が呼び出されました。(なぜですか?) - 両方の
m1()
メソッドが静的な場合、A のインスタンス ブロックから Main の m1() を呼び出すことは可能ですか? (私はノーだと思いますが、確かではありません)。
最初のケースではオーバーライドが行われており、2 番目のケースではメソッドの隠蔽が行われています。しかし、その知識に基づいて質問に答える方法はまだわかりません。