看看这个,先想想结果打印的顺序和a、b的值
public class ClassLoderTest {public static void main(String[] args) {staticFun();}static ClassLoderTest clt = new ClassLoderTest();static {System.out.println(1);}{System.out.println(2);}ClassLoderTest(){System.out.println(3);System.out.println("a="+a);System.out.println("b="+b);}public static void staticFun(){System.out.println(4);}int a = 11;static int b = 12;
}
如果有人想的答案是以打印1开头,或者b=12的,就都错了
正确答案:
2
3
a=11
b=0
1
4
原因:
就是先静态初始化本类实例,那么后面的静态初始化都会等到这个实例化完成才会执行。
详细过程是这样的:
1、调用main方法,触发类的静态初始化
2、第一个静态变量是ClassLoderTest类本身,于是就执行new ClassLoderTest()初始化
3、由于这个没执行完,后面的静态代码块和静态变量就先等等
4、既然是类的初始化,那就先执行普通代码块,打印出2
5、再初始化成员变量,a=11,但b因为是静态变量,并没有赋值,所以这时b=0
6、再执行构造方法,打印出3,a=11,b=0,此时类初始化完成
7、这时才执行后面的静态初始化,于是执行到静态代码块,打印出1
8、再初始化静态变量b,此时b=12
9、所有初始化都完成,最后再调用main方法中的静态方法,打印出4