0

この質問は、JAVA PROGRAMMING LANAGUAGEの本で尋ねられ、説明されています。しかし、説明がはっきりしていません。

誰かがそれをもっと明確に説明できますか?

本での説明は::

X のコンパイル時に Y のコードが記述されていない可能性があるため、この周期的な静的初期化は、コンパイル中に確実に検出することはできません。サイクルが発生した場合、X の静的初期化子は、Y のメソッドが呼び出された時点までしか実行されません。次に、Y が X メソッドを呼び出すと、そのメソッドは残りの静的初期化子がまだ実行されていない状態で実行されます。初期化子が実行されていない X の静的フィールドは、デフォルト値 (型に応じて false、「/u0000」、ゼロ、または null) のままです。

4

1 に答える 1

1

簡単に言えば、スレッドがクラス X を別の理由で初期化する必要があるときにクラス X を既に初期化している場合 (たとえば、クラス Y がクラス X から何かを使用するため)、スレッドはそれをスキップします。すべての静的変数にはデフォルト値があります。

何が起こっているかの正確な説明については、Java 言語仕様のセクション 12.4.2を参照してください。特に:

C の Class オブジェクトが、現在のスレッドによって C の初期化が進行中であることを示している場合、これは初期化の再帰的な要求である必要があります。LC を解放し、正常に完了します。

于 2012-12-20T11:41:55.767 に答える