Java がクラスを継承してサブクラス オブジェクトを作成する場合、実行シーケンスは次のとおりです。
1. サブクラスのすべてのフィールドにメモリを割り当て、デフォルト値(親クラスから継承した値を含む)を初期化してから、コンストラクターを実行します(定義されていない場合は、デフォルトの引数なしのコンストラクターを実行します)
2. 各コンストラクターの実行は 3 つの段階を経ます (これは再帰的なプロセスであることに注意してください)。
2.1 親クラスのコンストラクターを明示的に (スーパー) 呼び出すか、親クラスの引数なしのコンストラクターを暗黙的に呼び出します。このコンストラクターが明示的に呼び出された場合、明示的または暗黙的な親クラス コンストラクターの呼び出しが検出されるまで呼び出しチェーンが実行されます。
2.2 イニシャライザまたは初期化ブロックを使用してフィールドを初期化する
2.3 コンストラクタ本体の実行
例を見てみましょう:
A.java:
package study;
public class A {
A()
{
System.out.println("A()");
this.testpublic();
this.testprivate();
}
A(int i)
{
System.out.println("A("+i+")");
testpublic();
}
public void testpublic()
{
System.out.println("A.testpublic()");
}
private void testprivate()
{
System.out.println("A.testprivate()");
}
}
B.ジャワ
package study;
public class B extends A {
B(){
this(4);
System.out.println("B()");
}
B(int i)
{
System.out.println("B("+i+")");
}
public void testpublic()
{
System.out.println("B.testpublic()");
}
public void testprivate()
{
System.out.println("B.testprivate()");
}
}
メイン.java
package study;
public class Main {
public static void main(String argv[])
{
A b = new B();
b.testpublic();
}
}
まず、実行結果がどうなるかを考えてください。プログラムの実行結果は次のとおりです。
B()->B(4)->A()->B(4)->B()
これは再帰的なプロセスであることがわかります。実際、ここでは A() の実行フェーズは無視されます。A はデフォルトで Object クラスから継承されます。つまり、A のコンストラクターは親クラスを呼び出し続けます。最上位クラスまでのオブジェクトのコンストラクター。
また、コンストラクター レベルでの Java ポリモーフィズムの性質についても説明しました。ここでパブリックとプライベートの違いに注目してください。具体的な理由についてはまだ解明されていないので、ご存知の方がいらっしゃいましたらご教示いただければ幸いです。