类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次。
下面这个例子可以帮助理解:
1 package untility; 2 3 public class A { 4 // 静态块 5 static { 6 A c ; 7 System.out.println(200); 8 c = new A(); 9 i = 10; 10 } 11 12 public static int i; 13 public int j; 14 15 public A() { 16 System.out.println(A.i); 17 System.out.println(j); 18 } 19 20 public static void main(String[] args) { 21 A a = null; 22 System.out.println(100); 23 a = new A(); 24 //A b = new A(); 25 } 26 }
运行结果:
200 0 0 100 10 0
解析:
程序从main方法进去,执行到21行代码加载类,然后执行static模块,继续执行到第6行,再次加载类,再次运行到static模块,此时第6行已经被执行过一次,所以不会再被执行(写完Java类的静态块の二发现这里的描述是有问题的,这里不会重复加载A类,只会重复往下执行第7行),然后执行第7行,所以第一个被打印出来是200,然后执行第8句的构造函数(没有执行到第9句,所以i和j都是0),打印出来2个0,然后继续执行static模块中的第9句,此时i=10,到此加载类完成,然后继续执行21行的=null语句,在执行22行的打印,输出100,最后执行第23行的构造函数,打印出来10 0(因为i是静态的)。