9

空のブロックを使用する目的は何だろうと思っています。例えば、

    static{
        int x = 5;
    }

    public static void main (String [] args){

          int i = 10;

          {
               int j = 0 ;
               System.out.println(x);  // compiler error : can't find x ?? why ??
               System.out.println(i);  // this is fine
          }
          System.out.println(j); //compiler error :  can't find j

    }

誰か説明してくれませんか

  1. 空のブロックを使用する状況。
  2. その空のブロック内のすべての変数はまだ続いていstackますか?
  3. にアクセスできなかったのはなぜstatic variable xですか?
4

3 に答える 3

7
  1. 投稿に表示されているブロックは空のブロックではなく、静的初期化子です。クラスの静的変数に重要な初期化を提供するために使用されます
  2. ヒープから割り当てたオブジェクトを除いて、初期化中に使用するローカル変数はスタックに置かれます
  3. x宣言していないため、静的変数にアクセスできません。x代わりに、静的初期化子内でローカル変数を宣言しました。

x静的変数を作成してから静的初期化ブロックで初期化したい場合は、次のようにします。

private static int x;
static {
    x = 5;
}

このような些細なケースでは、単純な初期化構文が最適です。

private static int x = 5;

初期化ブロックは、ループを使用して構造体を初期化する必要がある場合など、より複雑な作業のために予約されています。

private static List<List<String>> x = new ArrayList<List<String>>();
static {
    for (int i = 0 ; i != 10 ; i++) {
        x.add(new ArrayList<String>(20));
    }
}
于 2012-08-19T04:03:59.757 に答える
3
  1. 匿名コード ブロックは、変数のスコープを制限する場合にのみ役立ちます。彼らには真の目的がありません。
  2. はい。ただし、スコープはそのブロック内に限定されます。
  3. x のスコープは、クラスの静的スコープ内ではなく、メソッド内で宣言されるため (静的コンテキストは内部的にメソッドです)、静的初期化ブロックに限定されます。
于 2012-08-19T03:59:25.713 に答える
3

静的ブロックは、クラスの初期化時に実行されるため、静的メンバーを初期化するのに役立ちます。

static final Map<K, V> MY_MAP = ...;

static {
  MY_MAP.put(...);
  ...
}

その空のブロック内のすべての変数はまだスタックにありますか?

static ブロックで宣言された変数はローカル変数であり、クラスの静的メンバーではありません。@veer が指摘するように、それがスタック上にあるかどうかは VM 実装の詳細です。


main静的変数にアクセスできなかったのはなぜxですか?

staticこれは、イニシャライザの実行中にのみ存在するローカル変数であるためです。

于 2012-08-19T04:01:44.337 に答える