下面的代码中有2个静态块,为什么编译器不认为第一个块中未指定数据类型y是错误i?同时,如果i = 0在初始化时去掉了数据类型,也会出错,如果只在第二个块中指定数据类型,也会出错。
public class Test {
static {
i = 10;
}
static int i = 0;
static {
++i;
}
public static void main(String[] args) {
new Test();
System.out.println(i);
}
}
编译器将首先处理静态变量的声明,然后静态初始化和/或静态变量赋值的块才会按照代码中定义的顺序执行。特别是,这将导致第一个块中的分配 10 丢失。
顺序是:
i。static {i = 10;}static int i = 0static {++i; // 1}System.out.println(i);但是,如果您尝试在第一个静态初始化块中引用变量(例如, ),则会因访问未定义的变量而发生编译错误。请参阅哪些情况允许在静态初始化块中进行前向引用?
当然,最终会得到一个错误声明的静态变量(未指定类型)。
在这种情况下,您可以在静态初始化块中声明一个局部变量,对其进行更改不会影响类变量的值。
修改后的例子:
结果: