最近,我研究了虚拟机如何加载静态变量,但我遇到了以下问题:
public class Example{
static{
num = 3;
System.out.print(num);
}
public static int num;
}
编译器报告错误。我认为num
具有内存区域和价值。为什么我无法访问num
变量?
static
块和声明按编码顺序执行。这意味着在执行静态块时,尚未定义num
字段。
简单的解决方法是将声明移动到块上方。
Java 语言规范第 8.3.2.3 节(以及其他内容)说,变量可以在声明之前赋值,但在声明变量之前可能无法访问变量的值,除非其名称是完全限定的,因此编译:
public class Example {
static{
num = 3; // assignment OK without qualifying the name
System.out.print(Example.num); // name must be qualified to access value
}
public static int num;
}
更有趣的是,如果在声明之前访问了一个变量,则使用其默认值,并且仍然在声明时进行进一步初始化,因此以下代码:
public class Example {
static{
System.out.println(Example.num); // uses default value
num = 3; // assignment OK
System.out.println(Example.num); // assigned value (3) is visible
}
public static int num = 1; // initialization to 1 occurs
static{
System.out.print(Example.num); // initialized value (1) is visible
}
}
生成以下输出:
0
3
1
哇!