1

インスタンス制御フローと静的制御フローをいじっています。以下のコードに注目してください。

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 を学んでいます):

  1. 両方のm1()メソッドが静的でない場合、A のインスタンス ブロックから A の m1() を呼び出すことは可能ですか? やってみましたthis.m1()が、それでも Main の m1() が呼び出されました。(なぜですか?)
  2. 両方のm1()メソッドが静的な場合、A のインスタンス ブロックから Main の m1() を呼び出すことは可能ですか? (私はノーだと思いますが、確かではありません)。

    最初のケースではオーバーライドが行われており、2 番目のケースではメソッドの隠蔽が行われています。しかし、その知識に基づいて質問に答える方法はまだわかりません。
4

2 に答える 2