6

こんにちはstackoverflowのメンバー、「クラスの読み込み時間」の実際の意味に関連する小さな質問があります。

たとえば、次のコード:

public class Sequence {
    Sequence() {
        System.out.print("c ");
    }
    {
        System.out.print("y ");
    }
    public static void main(String[] args) {
        System.out.println("Indeed");
        new Sequence().go();
    }
    void go() {
        System.out.print("g ");
    }
    static { System.out.println("x "); }
} 

静的な最初の「x」を出力するため、静的な初期化ブロックは常に「クラスの読み込み時間」に読み込まれます。わかりましたが、このロード時間がいつ発生するか正確に知っていますか? クラスが最初のオブジェクトを作成してメインメソッドで最初に呼び出されると思ったのですが、その場合、最初に「確かに」と出力することで結果が異なるはずです。この疑問を明確にするのを手伝ってくれる人はいますか? この引数について一般的に話している他の投稿を確認しましたが、上記のコードで「クラスの読み込み時間」がいつ発生するかを正確に知ることは、(少なくとも私にとっては) もっと明確になると思います。

前もって感謝します。

4

5 に答える 5

3

あなたの質問に対する答えは、JLSの第12.4.1章「初期化が発生したとき」にあります。

クラスまたはインターフェイスタイプTは、次のいずれかが最初に発生する直前に初期化されます。

  • Tはクラスであり、のインスタンスTが作成されます。
  • Tはクラスであり、によって宣言された静的メソッドTが呼び出されます。
  • によって宣言された静的フィールドTが割り当てられます。
  • によって宣言された静的フィールドTが使用され、フィールドは定数変数ではありません(§4.12.4)。
  • Tはトップレベルクラス(§7.6)であり、(§8.1.3)内に字句的にネストされたassertステートメント(T§14.10)が実行されます。

上記の数行をJLSの第12.4章で読み始めることをお勧めします。クラスとインターフェースの初期化

第12章から始めてください。実行では、クラスをいつロードする必要があるかを正確に説明しています。初期化はロード後に行われます。

于 2013-02-06T11:33:41.977 に答える
3

静的initブロックがクラスのロード時に実行されるというのは真実ではありません。これらはクラスの初期化時に実行されます。前者が発生する正確な時点は指定されていませんが、後者には厳密な指定があります。これは、クラスの最初の実行時アクセス時に発生します。

于 2013-02-06T11:34:40.927 に答える
3

mainメソッドはclassSequenceあるため、最初に JVM によってロードする必要があります。"x"したがって、それが最初に印刷されるのは完全に理にかなっています。

于 2013-02-06T11:29:21.110 に答える
3

そうです、静的ブロックはrunクラスがロードされたときです。これは、プログラムを実行したときに発生します。メインメソッド自体がクラス内にあるため、前Sequenceの出力は正しいです。xIndeed

于 2013-02-06T11:29:50.500 に答える
1

メソッドが JVM によって呼び出される前にクラスSequenceをロードする必要がmainあります。これにより、静的な初期化が行われるためx、最初に出力されるのはなぜですか。

于 2013-02-06T11:31:56.170 に答える