次のようにコードをコピーします。
パブリック クラス Test4 {
@テスト
public void test(){
子子 = 新しい子();
}
}
クラスの親{
public static StringparentStaticField = "親クラスの静的変数";
public StringparentNormalField = "親クラスの通常変数";
静的 {
System.out.println(parentStaticField);
System.out.println("親クラスの静的ブロック");
}
{
System.out.println(parentNormalField);
System.out.println("親クラスの通常ブロック");
}
パブリック親(){
System.out.println("親クラスのコンストラクター");
}
}
クラスの子は親を拡張します{
public static String childStaticField = "サブクラス静的変数";
public String childNormalField = "サブクラス正規変数";
静的 {
System.out.println(childStaticField);
System.out.println("サブクラス静的ブロック");
}
{
System.out.println(childNormalField);
System.out.println("サブクラス通常ブロック");
}
public child(){
System.out.println("サブクラス コンストラクター");
}
}
出力:
次のようにコードをコピーします。
親クラスの静的変数
親クラスの静的ブロック
サブクラス静的変数
サブクラス静的ブロック
親クラスの通常変数
親クラスのノーマルブロック
親クラスのコンストラクター
通常の変数をサブクラス化する
サブクラス通常ブロック
サブクラスコンストラクター
実行プロセス:
1. 新しい子を実行するとき、ローダーはコンパイルされた子クラスのコード (つまり、child.class ファイル) を探します。ロードプロセス中に、ローダーは基本クラスがあることに気づき、基本クラスを再度ロードします。このプロセスは、基本クラス オブジェクトを作成するかどうかに関係なく、常に発生します。基本クラスに別の基本クラスがある場合は、2 番目の基本クラスもロードされます (以下同様)。
2. ルート基本クラスの静的初期化を実行し、次に次の派生クラスの静的初期化を実行します。派生クラスの「静的初期化」は基本クラスのメンバーの正しい初期化に依存する可能性があるため、この順序は非常に重要です。
3. 必要なクラスがすべてロードされたら、子クラス オブジェクトを作成します。
4. 子クラスに親クラスがある場合、super を使用してどのコンストラクターを呼び出すかを指定できます。
基底クラスの構築手順や構築順序は派生クラスと同様です。まず、基本クラスの各変数がリテラル順序で初期化され、次に基本クラスの残りのコンストラクターが実行されます。
5. 宣言された順序でサブクラスのメンバー データを初期化し、残りのサブクラス コンストラクターを実行します。