最近,我研究虚拟机如何加载静态变量,但是我遇到了如下问题:
public class Example{
static{
num = 3;
System.out.print(num);
}
public static int num;
}
编译器报告错误。我认为num
有内存区域和值。为什么我无法访问num
变量?
答案 0 :(得分:6)
static
块和声明按照它们编码的顺序执行。这意味着在静态块执行时,尚未定义num
字段。
简单的解决方法是将声明移到块上。
Java Language Specification Section 8.3.2.3(除其他外)表示变量可能会在声明之前分配值,但变量的值可能不是< em>在声明变量之前访问,除非其名称是完全限定的,因此编译:
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
哇!