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);
答案 0 :(得分:1)
基本上,首先评估静态变量和块,然后编译器再次运行并评估静态方法,然后处理所有实例变量,块和方法。
这就是为什么可以从m1()
方法调用所有静态变量的原因
答案 1 :(得分:0)
静态块在定义时以及静态字段初始化之前执行。
如您所见,您正在使用
static int z = 100;
static int a;
在静态块中,然后正确对其进行初始化。
无论如何,访问static
块内调用m1
的{{1}}字段将只打印static
,因为它们不是属性初始化的,而是使用默认值。 / p>