親子クラスの初期化の順序

2042 ワード

自分で親子の初期化に対する理解をテストしてみたが、まだ正確ではないことに気づいた.以下はテストの結果です.
package com.java.parentandchild;

public class Parent {

	public static void sysOut() {
		System.out.println(" 。");
	}
	public Parent(){
		System.out.println(" 。");
	}
	static {
		System.out.println(" 。");
	}

}

 
サブクラス
package com.java.parentandchild;

public class Child extends Parent {

	public static void sysOut() {
		System.out.println(" 。");
	}
	public Child() {
		System.out.println(" 。");
	}
	static {
		System.out.println(" 。");
	}

}

 
クライアント(直接初期化サブクラス)の場合(第1の場合)
package com.java.parentandchild;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// Parent parent = new Parent();
		System.out.println("============");
		Child child = new Child();
	}

}

出力結果
==============私は親の静的コードブロックです.私はサブクラスの静的コードブロックです.私は親の構造関数です.私はサブクラスの構造関数です.
クライアントが親後子クラスである場合(第2の場合)
package com.java.parentandchild;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 Parent parent = new Parent();
		System.out.println("============");
		Child child = new Child();
	}

}

出力:
私は親クラスの静的コードブロックです.私は親クラスのコンストラクション関数です.=============私はサブクラスの静的コードブロックです.私は親の構造関数です.私はサブクラスの構造関数です.
以下は私のこの結果に対する理解です.
 
1つ目の場合:初期化順では、親の静的コードブロック、次に親のコンストラクション関数、子の静的コードブロック、子のコンストラクション関数が実行されるに違いありません.
第2の場合:newの1つの親のオブジェクトであるため、親の静的コードブロックと構造関数を先に実行するに違いない.newサブクラスのオブジェクトの場合、前に親に対してnewが行われているため、サブクラスを行う静的コードブロックの初期化、次に親クラスのコンストラクション関数、最後にサブクラスのコンストラクション関数が直接行われる.