[解決済み] Java の静的/インスタンス・イニシャライザー・ブロックはどのような順序で実行されるのですか?
2022-12-08 09:40:22
質問
あるプロジェクトにいくつかのクラスがあり、それぞれに静的イニシャライザブロックがあるとします。 これらのブロックはどのような順序で実行されますか。 私は、クラス内で、そのようなブロックがコードに表示される順序で実行されることを知っています。 しかし、私が書いたいくつかのサンプルコードはそれに反しています。 私はこのコードを使用しました。
package pkg;
public class LoadTest {
public static void main(String[] args) {
System.out.println("START");
new Child();
System.out.println("END");
}
}
class Parent extends Grandparent {
// Instance init block
{
System.out.println("instance - parent");
}
// Constructor
public Parent() {
System.out.println("constructor - parent");
}
// Static init block
static {
System.out.println("static - parent");
}
}
class Grandparent {
// Static init block
static {
System.out.println("static - grandparent");
}
// Instance init block
{
System.out.println("instance - grandparent");
}
// Constructor
public Grandparent() {
System.out.println("constructor - grandparent");
}
}
class Child extends Parent {
// Constructor
public Child() {
System.out.println("constructor - child");
}
// Static init block
static {
System.out.println("static - child");
}
// Instance init block
{
System.out.println("instance - child");
}
}
を実行すると、このような出力が得られます。
開始
静的 - 祖父母
静的 - 親
静的 - 子
インスタンス - 祖父母
コンストラクタ - グランドペアレント
インスタンス - 親
コンストラクタ - 親
インスタンス - 子
コンストラクタ - 子
END
そこから得られる明白な答えは、親のブロックは子のブロックより先に実行されるということですが、それは単なる偶然かもしれませんし、2つのクラスが同じ階層にない場合は役に立ちません。
EDIT
LoadTest.javaにこれを追記して、サンプルコードを修正しました。
class IAmAClassThatIsNeverUsed {
// Constructor
public IAmAClassThatIsNeverUsed() {
System.out.println("constructor - IAACTINU");
}
// Instance init block
{
System.out.println("instance - IAACTINU");
}
// Static init block
static {
System.out.println("static - IAACTINU");
}
}
クラス名からわかるように、私は新しいクラスをどこにも参照しませんでした。 新しいプログラムは古いものと同じ出力を生成しました。
どのように解決するのですか?
クラスの静的イニシャライザーは、インスタンスの生成、静的メソッドやフィールドへのアクセスなど、そのクラスに初めてアクセスした際に実行されます。
したがって、複数のクラスについて、これは完全にこれらのクラスがロードされるために実行されるコードに依存します。
関連
-
-bash: java: コマンドが見つからない 解決方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] Javaにおける静的クラス
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み】静的初期化コードブロックと非静的初期化コードブロックの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Uncaught ReferenceError: は定義されていません。
-
強制型変換について
-
セミコロン期待値エラー解決
-
FindBugの使用概要
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
Java基礎 - マッピングとQ/A
-
[解決済み] 静的クラスの初期化はいつ行われるのか?