16

私の友人の一人が、最初の静的変数または静的ブロックをロードするものを私に尋ねました。

私の答えは静的変数を指しています。

それで彼は私に2つの方程式を与え、それらを区別すると言いました
最初の方程式

public class Some {
    public static void main(String args[])
    {
        System.out.println(Some.x);
    }
    static {
        System.out.println(Some.x);
    }
    static int x=90;
}

O / P:0 90

2番目の方程式

public class Some {
    public static void main(String args[])
    {
        System.out.println(Some.x);
    }
    static int x=90;
    static {
        System.out.println(Some.x);
    }
}

O / P:90 90

バイトコードを逆コンパイルしようとしましたが、上記の式の両方で同じであることがわかりました。それらを区別するのを手伝ってください。静的変数がいつ初期化されるのか混乱しています。

4

4 に答える 4

8

静的ブロックは、ソース ファイルに表示される順序で初期化されます。スタックオーバーフローに関するこれに関連するいくつかの質問がすでにあります...これはあなたにとって良い答えです: Java:静的最終フィールドはどのような順序で初期化されますか?

于 2013-03-15T08:33:28.303 に答える
2

静的変数と静的ブロックは、表示される順序で実行されます。

ここで最初のO/P:System.out.println(Some.x);090静的変数初期化ステートメントの後に実行された静的ブロックのステートメントのようにstatic int x=90;

于 2013-03-15T08:37:20.603 に答える
-1

静的なものとインスタンスのものの制御フローの簡単な例を示しています。

2つのクラスAとBがあるとします。クラスAはクラスBに拡張され、クラスBにはmainメソッドがあります。両方のコマンドが正常にコンパイルされた後、cmdは次のようになります。

java B

さて、何が起こるかをステップバイステップで見てください:

  1. クラスAとBがロードされます
  2. クラスAの静的メンバーとブロックが識別され、順次(1つずつ)実行されます(ただし、クラスのロード時に1回のみ)
  3. クラスBの静的メンバーとブロックが識別されて実行されます(1つずつ)(ただし、クラスのロード時に1回のみ)
  4. クラスBのメインメソッドが呼び出されます(クラスBにメインメソッドがない場合は、クラスAのメインメソッドが呼び出されます)
  5. クラスAのオブジェクトを作成するとすぐに、すべてのインスタンスメンバーの初期化とインスタンスブロックの実行がクラスAで実行されます。
  6. (オブジェクトの作成に使用した)クラスAのコンストラクターが実行されます
  7. クラスBのオブジェクトを作成する場合:すべてのインスタンスメンバーの初期化とインスタンスブロックの実行はクラスAで行われます。
  8. クラスAのコンストラクター(デフォルトのコンストラクターまたはBのコンストラクターから呼び出した場合はその他)が実行されます

  9. その後、すべてのインスタンスメンバーの初期化とインスタンスブロックの実行はクラスBで行われます。

  10. その後、クラスB(オブジェクトの作成に使用した)のコンストラクターが実行されます

注:静的メンバーとブロックの実行は、クラスを初めてロードするときに1回だけ実行されますが、インスタンスメンバーとインスタンスブロックは、クラスのオブジェクトを作成するたびに実行されます。正しくない場合はお知らせください。

于 2013-03-15T08:51:57.117 に答える
-1

static 変数は、JVM がクラスをロードするときに実行され、インスタンス化されるか、静的メソッドが呼び出されるときにクラスがロードされます。

static Initializer ブロックは、クラスがインスタンス化される前、またはその静的メソッドが呼び出される前、さらにその静的変数が使用される前に初期化されます。

于 2013-03-15T08:40:08.370 に答える