分析以下静态块中的一些奇怪场景:
static {
System.out.println("Inside Static Block");
i=100; // Compilation Successful , why ?
System.out.println(i); // Compilation error "Cannot reference a field before it is defined"
}
private static int i=100;
虽然使用相同的代码工作正常:
static {
System.out.println("Inside Static Block");
i=100; // Compilation Successful , why ?
System.out.println(MyClass.i); // Compiles OK
}
private static int i=100;
不确定为什么变量初始化在SOP需要时不需要使用类名进行变量访问?
答案 0 :(得分:14)
这是因为restrictions on the use of Fields during Initialization。特别是,静态初始化块在声明它们的行之前的静态字段的使用只能在表达式的左侧(即赋值),除非它们是完全限定的(在您的情况下{{1 }})。
例如:如果您在MyClass.i
之后插入int j = i;
,则会出现同样的错误。
解决问题的显而易见的方法是在静态初始化块之前声明i = 100;
。
答案 1 :(得分:0)
这是因为编译器进行静态代码分析,例如实时变量分析(反向分析)。它计算每个程序点是否在下次写入之前读取变量。