1. ホーム
  2. java

[解決済み] 静的クラスの初期化はいつ行われるのか?

2022-09-19 06:34:06

質問

静的フィールドはいつ初期化されるのですか? クラスをインスタンス化することなく、静的フィールドにアクセスした場合、プライベート静的フィールドのインスタンス化に使用したすべての静的ブロックとプライベート静的メソッドは、その瞬間に(順番に)呼び出されるのでしょうか?

静的メソッドを呼び出したらどうなるのでしょうか?すべての静的ブロックも実行されますか?メソッドの前に?

どのように解決するのですか?

クラスの静的初期化は、通常、次のイベントのいずれかが初めて発生する直前に行われます。

  • クラスのインスタンスが生成される。
  • クラスの静的メソッドが呼び出される。
  • クラスの静的フィールドが割り当てられる。
  • 定数でない静的フィールドが使用されている、または
  • <ストライク トップレベルクラスの場合、そのクラス内に辞書的にネストされた assert 文が実行されます。 1 .

参照 JLS 12.4.1 .

また、クラスを強制的に初期化することも可能です(まだ初期化されていない場合)。 Class.forName(fqn, true, classLoader) あるいは、短い形式の Class.forName(fqn)


静的なクラスの初期化はいつ行われるのですか?

上記を参照してください。

<ブロッククオート

静的フィールドはいつ初期化されるのですか?

静的なクラス初期化の一部として、上記を参照してください。

クラスをインスタンス化することはないが、静的フィールドにアクセスする場合、プライベート静的フィールドのインスタンス化に使用されるすべての静的ブロックとプライベート静的メソッドは、その瞬間に(順番に)呼び出されるのでしょうか?

はい、そうです。 (本当に瞬間的なものはないということを前提に)。

静的メソッドを呼び出したらどうなりますか?すべての静的ブロックも実行されるのでしょうか?メソッドの前に?

はい、そしてはい。


を観測するようなコードを構築することが可能であることに注意してください。 デフォルトの初期化された の値を観測するようなコードを構築することが可能であることに注意してください。


1 - 最後の箇条書きは、Java 6 から Java 8 の JLS に存在しましたが、どうやら仕様の誤りだったようです。 これは最終的に Java 9 の JLS で修正されました。 ソース .