public class Test
{
static
{
i=0;
System.out.println(i);//这句编译器会报错:Cannot reference a field before it is defined(非法向前应用)
}
static int i=3;
public static void main(String[] args) {
}
}
实际测试:
{
i = 3;
}
static int i;
与
static int i;
{
i = 3;
}
字节码相同。
Thinking in java中提示了:
本例子中出现的问题实际因为成员i在未完成初始化前用于使用。
从侧面证明了,实际编译初始化静态代码块时,并非按执行顺序进行合并。
成员变量i如果满足如下的4点,就必须在使用前必须对该成员变量进行声明
- 设定其他类为直接包含该成员变量的类或者接口
- 如果i出现在在其他类C的 静态成员/非静态成员 初始化或者 C的静态或非静态代码块中
- 如果i不是一个赋值不等式的左值
- 通过简单名称来访问