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(...);
  ...
}

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

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


为什么不能main访问静态变量x

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

于 2012-08-19T04:01:44.337 回答