我想知道使用空块的目的是什么。例如,
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
? 答案 0 :(得分:6)
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));
}
}
答案 1 :(得分:3)
答案 2 :(得分:3)
静态块对于初始化静态成员很有用,因为它们在类初始化时运行。
static final Map<K, V> MY_MAP = ...;
static {
MY_MAP.put(...);
...
}
该空块内的所有变量是否仍在堆栈中?
静态块中声明的变量是局部变量,而不是类的静态成员。正如@veer指出的那样,它是否在堆栈上是一个VM实现细节。
为什么
main
无法访问静态变量x
?
因为它是一个仅在static
初始化程序的持续时间内存在的局部变量。