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 }
有人可以解释
- 在什么情况下我们想要使用空块。
- 那个空块内的所有变量是否仍在
stack
? - 为什么它不能访问
static variable x
?
- 您在post中显示的块不是空块,它是静态初始化程序。 它用于为类的静态变量提供非平凡的初始化
- 初始化期间使用的局部变量将进入堆栈,但从堆中分配的对象除外
- 您无法访问静态变量
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)); } }
- 匿名代码块仅对限制变量范围有用; 他们没有任何真正的目的。
- 是的,但范围仅限于该区块内。
- x的范围仅限于静态初始化块,因为它在方法中声明(静态上下文在内部是方法),而不是在类的静态范围内。
静态块对于初始化静态成员很有用,因为它们在类初始化时运行。
static final Map MY_MAP = ...; static { MY_MAP.put(...); ... }
那个空块内的所有变量是否仍然在堆栈中?
在静态块中声明的变量是局部变量,而不是类的静态成员。 正如@veer指出的那样,它是否在堆栈上是一个VM实现细节。
为什么无法
main
访问静态变量x
?
因为它是一个仅在static
初始化程序的持续时间内存在的局部变量。