java:访问静态块内的静态变量

分析以下静态块中的一些奇怪场景:

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需要时不需要使用类名进行变量访问?

这是因为在初始化期间使用字段的限制 。 特别是,静态初始化块在声明它们的行之前的静态字段的使用只能在表达式的左侧(即赋值),除非它们是完全限定的(在您的情况下为MyClass.i )。

例如:如果你插入int j = i;i = 100; 你会得到同样的错误。

解决这个问题的显而易见的方法是声明static int i; 静态初始化块之前

这是因为编译器进行静态代码分析,例如实时变量分析(后向分析)。 它计算每个程序点是否在下次写入之前读取变量。