Java空块范围

时间:2012-08-19 03:55:42

标签: java

我想知道使用空块的目的是什么。例如,

    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

3 个答案:

答案 0 :(得分:6)

  1. 您在帖子中显示的块不是空块,它是静态初始化程序。它用于为类的静态变量提供非平凡的初始化
  2. 您在初始化期间使用的局部变量将在堆栈上进行,但您从堆
  3. 分配的对象除外
  4. 您无法访问静态变量x,因为您没有声明它。相反,您在静态初始化程序中声明了一个局部变量x
  5. 如果您想使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));
        }
    }
    

答案 1 :(得分:3)

  1. 匿名代码块仅用于限制变量范围;他们没有任何真正的目的。
  2. 是的,但范围仅限于该区块内。
  3. x的范围仅限于静态初始化块,因为它在方法中声明(静态上下文在方法内部),而不是在类的静态范围内。

答案 2 :(得分:3)

静态块对于初始化静态成员很有用,因为它们在类初始化时运行。

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

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

  

该空块内的所有变量是否仍在堆栈中?

静态块中声明的变量是局部变量,而不是类的静态成员。正如@veer指出的那样,它是否在堆栈上是一个VM实现细节。


  

为什么main无法访问静态变量x

因为它是一个仅在static初始化程序的持续时间内存在的局部变量。