Java クラス継承コンストラクターの順序依存性

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 ポリモーフィズムの性質についても説明しました。ここでパブリックとプライベートの違いに注目してください。具体的な理由についてはまだ解明されていないので、ご存知の方がいらっしゃいましたらご教示いただければ幸いです。


おすすめ

転載: blog.csdn.net/g1093896295/article/details/79984698