JAVA継承関係における静的符号ブロック、非静的符号ブロックの実行順序
1689 ワード
クラスのコードは、クラスの最初のオブジェクトを作成するときにロードされます(各クラスのコンパイルコードは独自の独立したファイルに存在します..classファイル)とは、クラスの最初のオブジェクトを作成するときにロードされますが、staticメソッドとstaticドメインにアクセスするとロードされます.(コンストラクタもstaticメソッドですが、staticキーワードは明示的に書かれていません).クラスが初めて使用されるときもstaticが初期化されると、すべてのstaticオブジェクトとstaticコードセグメントがロード時にプログラムの順序で(クラス内のコードの書き込み順序)を順次初期化します.staticのオブジェクトまたはコードは一度だけ初期化されます.静的コードブロックではなく、クラスのオブジェクトを作成するときに順次実行されます.
継承関係の場合、クラスをインスタンス化するときに親が存在する場合、親が先にロードされ(staticオブジェクトとstaticコードが順番に実行されます)、親が親である場合は、このルールに従ってクラスのロードが先に行われ、次にサブクラスのロード(同じようにstaticオブジェクトとstaticコードが順番に実行されます)が行われ、クラスのロードが終了するとオブジェクトの作成が開始されます.
オブジェクトを作成するときは、まず親の基本タイプがデフォルト値に設定され、オブジェクト参照がnullに設定されます.非静的コードブロックの実行(前のプロシージャは書き込みコードの順)、コンストラクタが自動的に呼び出され、サブクラスの基本タイプがデフォルト値に設定され、オブジェクトリファレンスがnullに設定され、非静的コードブロックの実行(前のプロシージャは書き込みコードの順)、コンストラクタが呼び出され、オブジェクトの作成が完了します.
コードの例は次のとおりです.
実行結果:
A B F 0 X get j2 = 1 D j1 = 1
継承関係の場合、クラスをインスタンス化するときに親が存在する場合、親が先にロードされ(staticオブジェクトとstaticコードが順番に実行されます)、親が親である場合は、このルールに従ってクラスのロードが先に行われ、次にサブクラスのロード(同じようにstaticオブジェクトとstaticコードが順番に実行されます)が行われ、クラスのロードが終了するとオブジェクトの作成が開始されます.
オブジェクトを作成するときは、まず親の基本タイプがデフォルト値に設定され、オブジェクト参照がnullに設定されます.非静的コードブロックの実行(前のプロシージャは書き込みコードの順)、コンストラクタが自動的に呼び出され、サブクラスの基本タイプがデフォルト値に設定され、オブジェクトリファレンスがnullに設定され、非静的コードブロックの実行(前のプロシージャは書き込みコードの順)、コンストラクタが呼び出され、オブジェクトの作成が完了します.
コードの例は次のとおりです.
public class A {
{
System.out.println("F");
}
private int i = 0;
static {
System.out.println("A");
}
{
System.out.println(i);
}
public A(String temp) {
this(temp, null);
}
public A(String temp1, String temp2) {
System.out.println("X");
}
}
public class B extends A {
private int j = get();
static {
System.out.println("B");
}
private int get() {
System.out.println("get");
return 1;
}
{
System.out.println("j2 = " + j);
}
{
System.out.println("D");
}
public B() {
super("nihao", "pengyou!");
System.out.println("j1 = " + j);
}
public static void main(String[] args) {
B b = new B();
}
}
実行結果:
A B F 0 X get j2 = 1 D j1 = 1