class StaticControlFlow {
static int x = 10;
static int y ;
//First Static Block
static {
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(a);
m1();
System.out.println("static block 1");
}
// Main Method
public static void main(String[] args){
System.out.println("main method");
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(a);
m1();
}
// Static method
public static void m1(){
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(a);
System.out.println("static method m1");
}
// Second Static Block
static {
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(a);
m1();
System.out.println("Second Static Block ");
}
static int z = 100;
static int a ;
}
错误: -
static_control_flow>javac StaticControlFlow.java
StaticControlFlow.java:12: error: illegal forward reference
System.out.println(z);
^
StaticControlFlow.java:13: error: illegal forward reference
System.out.println(a);
^
StaticControlFlow.java:45: error: illegal forward reference
System.out.println(z);
^
StaticControlFlow.java:46: error: illegal forward reference
System.out.println(a);
基本上,首先计算静态变量和块,然后编译器执行第二次运行并评估静态方法,然后转到所有实例变量,块和方法。
这就是为什么可以从m1()
方法调用所有静态变量的原因
静态块在定义时执行,并在初始化静态字段之前执行。 你可以看到你正在使用
static int z = 100;
static int a;
在静态块内部,在它们被正确初始化之前。
无论如何,访问在static
块内调用m1
的那些static
字段将只打印0
,因为它们不是属性初始化并且使用默认值。