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

  1. 您在post中显示的块不是空块,它是静态初始化程序。 它用于为类的静态变量提供非平凡的初始化
  2. 初始化期间使用的局部变量将进入堆栈,但从堆中分配的对象除外
  3. 您无法访问静态变量x因为您没有声明它。 相反,您在静态初始化程序中声明了一个局部变量x

如果您想使x成为静态变量,然后在静态初始化块中初始化它,请执行以下操作:

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

在这种简单的情况下,直接的初始化语法效果最好:

 private static int x = 5; 

初始化程序块保留用于更复杂的工作,例如,当您需要使用循环初始化结构时:

 private static List> x = new ArrayList>(); static { for (int i = 0 ; i != 10 ; i++) { x.add(new ArrayList(20)); } } 
  1. 匿名代码块仅对限制变量范围有用; 他们没有任何真正的目的。
  2. 是的,但范围仅限于该区块内。
  3. x的范围仅限于静态初始化块,因为它在方法中声明(静态上下文在内部是方法),而不是在类的静态范围内。

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

 static final Map MY_MAP = ...; static { MY_MAP.put(...); ... } 

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

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


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

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