Java静的コードブロック、非静的コードブロック、静的変数、インスタンス変数、構造関数の実行順序を詳細に解読
2299 ワード
1、まず親を考慮せずに、本クラスのみを考慮する場合、実行順序は次のとおりです.
静的コードブロック|静的変数->非静的コードブロック|インスタンス変数->コンストラクション関数
静的コードブロックと静的変数の実行の前後順序はコードの作成順序であり、非静的コードブロックとインスタンス変数の実行順序もコードの作成の前後順序である.
次に、コードの例で説明するParentクラスを新規作成します.
コード出力結果:
====スタティツクコードブロック ======4 ====非静的コードブロック ====コンストラクタ ======2
実行順序がはっきりしている
2.次に、親が存在する場合の実行順序を続けます.
親静的ブロック|親静的変数->子静的ブロック|子静的変数->親非静的ブロック|親インスタンス変数->親コンストラクション関数->子非静的ブロック|子インスタンス変数->子コンストラクション関数
親クラスとサブクラスの静的コードブロックと静的変数の実行の前後順序は依然としてコードの作成順序であり、非静的コードブロックとインスタンス変数の実行順序もコードの作成の前後順序である.
次に、コードの例で説明するChildクラス継承パラメータクラスを新規作成します.
実行結果は次のとおりです.
====親静的コードブロック ######サブクラス静的コードブロック ######i=8 ====親非静的コードブロック ====親コンストラクション関数 ######サブクラス非静的コードブロック ######サブクラスコンストラクタ ######i=6
3、まとめ:
1.クラスコンテンツ(静的変数、静的初期化ブロック)=>インスタンスコンテンツ(変数、初期化ブロック、コンストラクタ)
2、親(静的変数、静的初期化ブロック)=> サブクラスの(静的変数、静的初期化ブロック)=>親クラスの(変数、初期化ブロック、コンストラクタ)=>サブクラス の(変数、初期化ブロック、コンストラクタ)
静的コードブロック|静的変数->非静的コードブロック|インスタンス変数->コンストラクション関数
静的コードブロックと静的変数の実行の前後順序はコードの作成順序であり、非静的コードブロックとインスタンス変数の実行順序もコードの作成の前後順序である.
次に、コードの例で説明するParentクラスを新規作成します.
public class Parent {
public static int i = 1;
static {
i = 4;
System.out.println("==== ");
}
public Parent() {
i = 2;
System.out.println("==== ");
}
{
i = 3;
System.out.println("==== ");
}
public static void main(String[] args) {
System.out.println("======"+i);
new Parent();
System.out.println("======"+i);
}
}
コード出力結果:
====スタティツクコードブロック ======4 ====非静的コードブロック ====コンストラクタ ======2
実行順序がはっきりしている
2.次に、親が存在する場合の実行順序を続けます.
親静的ブロック|親静的変数->子静的ブロック|子静的変数->親非静的ブロック|親インスタンス変数->親コンストラクション関数->子非静的ブロック|子インスタンス変数->子コンストラクション関数
親クラスとサブクラスの静的コードブロックと静的変数の実行の前後順序は依然としてコードの作成順序であり、非静的コードブロックとインスタンス変数の実行順序もコードの作成の前後順序である.
次に、コードの例で説明するChildクラス継承パラメータクラスを新規作成します.
public class Parent {
public static int i = 1;
static {
i = 4;
System.out.println("==== ");
}
public Parent() {
i = 2;
System.out.println("==== ");
}
{
i = 3;
System.out.println("==== ");
}
}
class Child extends Parent{
public Child() {
i = 6;
System.out.println("###### ");
}
{
i = 7;
System.out.println("###### ");
}
static {
i = 8;
System.out.println("###### ");
}
public static void main(String[] args) {
System.out.println("######i="+i);
new Child();
System.out.println("######i="+i);
}
}
実行結果は次のとおりです.
====親静的コードブロック ######サブクラス静的コードブロック ######i=8 ====親非静的コードブロック ====親コンストラクション関数 ######サブクラス非静的コードブロック ######サブクラスコンストラクタ ######i=6
3、まとめ:
1.クラスコンテンツ(静的変数、静的初期化ブロック)=>インスタンスコンテンツ(変数、初期化ブロック、コンストラクタ)
2、親(静的変数、静的初期化ブロック)=> サブクラスの(静的変数、静的初期化ブロック)=>親クラスの(変数、初期化ブロック、コンストラクタ)=>サブクラス の(変数、初期化ブロック、コンストラクタ)