2013-02-06 24 views
5

こんにちは、stackoverflowのメンバー、 ここでは、 "クラスの読み込み時間"の実際の意味に関連する小さな質問です。クラスJavaでの読み込み時間

たとえば次のコード

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」静的INITブロックは常に「クラスローディング時間」にロードされるように静的です。 私はそれを得るが、このロード時間がいつ起こるのか正確に知っていますか?私はクラスが最初のオブジェクトを作成することでmainメソッドで最初に呼び出されたときに、最初の "Indeed"を出力して結果が異なるはずだと思いました。 誰でもこの疑念を明確にするのに役立ちますか?私はこの議論について一般的に話している他の投稿をチェックしましたが、それでもなお、上記のコードで「クラスの読み込み時間」がいつ発生するかを知ることは、少なくとも私にとってははっきりしていると思います。

ありがとうございます。

+0

もう少し明確にするために、私はこの小さなプログラムの出力を知っており、なぜこの出力を出すのか分かります。しかし、私はいつ正確に "クラスの読み込み時間"が発生するか知りたいです。 – Rollerball

+1

'クラスがJVMにロードされるたびに、いつ「クラスの読み込み時間」が発生するかを知りたいと思います。 :) – PermGenError

+0

ClassNotFoundExceptionを除いて、基本的なJVM-Jobsについて心配するべきではないと思います。 – duffy356

答えて

3

あなたの質問への答えは、次のいずれかの 最初に出現する直前に初期化されますJLS Chapter 12.4.1 When Initialization Occurs

クラスまたはインタフェースタイプTである:

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

私はあなただけChapter 12. Executionで始まるJLS Chapter 12.4. Initialization of Classes and Interfaces

上記の数行を読み始めるお勧めします クラスをロードする必要がある場合、それは正確に記述しています。初期化はロード後に行われます。

3

mainメソッドがのクラスSequenceにあるため、最初にJVMによってロードする必要があります。だから、"x"が最初に印刷されることが理にかなっています。

3

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

1

クラスSequencemain方法がxがプリントアウトされた最初のものである理由ので、場所を取るとする静的initialializationの原因となるJVMによって呼び出される前にロードする必要があります。

2

スタティックなinitブロックがクラスのロード時に実行されるのは当てはまりません。それらはクラス初期化時間で実行されます。前者が起こる正確な時点は明記されていませんが、後者のための厳密な仕様があります。最初の実行時にが発生し、クラスのが発生します。

関連する問題