クラスはいつロードされますか?
クラスのロードは、クラス ローダー (Classloader) を通じて完了します。中国式の [eagerlyload] (他のクラスが参照している限りロードする) でクラスをロードするか、または遅延ロード [lazy load] (ロード前にクラスの初期化が行われるまで待機する) のいずれかになります。 (推奨学習: java コース)
ただし、これはさまざまな JVM 実装に関連していると思いますが、JLS によって保証されています (静的初期化要件がロードされる場合のみ) )。
クラスはいつ初期化されますか?
クラスがロードされた後、クラスの初期化が行われます。これは、すべてのクラスの静的メンバーが初期化されることを意味します。クラスは次の状況で初期化されます。
インスタンスは new() キーワードまたは class.forName() リフレクションを使用して作成されますが、ClassNotFoundException が発生する可能性があります。
クラスの静的メソッドが呼び出されます
#クラスの静的フィールドが割り当てられます#静的フィールドにアクセスされますが、それは定数ではありません
最上位クラスのassert ステートメントで実行されます
リフレクションは、java.lang.reflect パッケージの特定のメソッドなどのクラスを初期化することもできます。JLS では、「クラスはいかなる理由でも初期化されない」と厳密に規定されています。上記以外のもの。
クラスの初期化方法クラスの初期化がいつトリガーされるかは、Java 言語仕様に正確に記述されていることがわかりました。ただし、フィールド (フィールド、静的または非静的)、ブロック (静的または非静的)、さまざまなクラス (サブクラスとスーパークラス)、およびさまざまなインターフェイス (サブインターフェイス、実装クラス、スーパーインターフェイス) については明確に理解してください。初期化の順序も重要です。クラス。
実際、多くのコア Java 面接の質問と SCJP の質問は、これらの概念に基づいています。クラスの初期化に関するいくつかのルールを次に示します。クラスの初期化は、上から下の順序で行われます。したがって、上部で宣言されたフィールドは下部のフィールドよりも早く初期化されます
スーパー クラスはサブクラスおよび派生クラスよりも早く初期化されます
クラスの初期化が静的フィールドへのアクセスによってトリガーされる場合, then 静的フィールドを宣言したクラスのみが初期化され、静的フィールドがサブクラス、サブインターフェイス、またはその実装クラスによって参照されている場合でも、スーパークラスの初期化やサブクラスの初期化はトリガーされません。
インターフェイスの初期化によって、親インターフェイスは初期化されません。
静的フィールドの初期化はクラスの静的初期化中に行われ、非静的フィールドの初期化はクラスのインスタンスの作成中に行われます。これは、静的フィールドが非静的フィールドの前に初期化されることを意味します。
非静的フィールドは、コンストラクターを通じて初期化されます。サブクラスのコンストラクターは、初期化を行う前に、親クラスのコンストラクターを暗黙的に呼び出します。これにより、非静的変数またはインスタンス変数 (親クラス) が確実に初期化されます。子供よりも早いです。
以上がJava クラスはいつロードされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。