其实这段代码不难以理解,只需要注意一下几点:静态变量只会初始化一次,在初始化的时候int会被赋值为0
所以也就意味着在这个静态变量只会在第一次加载该类的时候运行。
然后看代码:
注意在main方法中 该类 已经 第一次初始化了,也就是下面这段代码:public static void main(String[] args){
ExeOrder1 e=new ExeOrder1("init"); //注意,第一次初始化在这里。}
随后main方法中类 e 初始化的时候首先会初始化静态变量:如下代码public static int k=0;public static ExeOrder1 e1 = new ExeOrder1("t1");
当执行到第二行的时候会再次加载类,那么此时由于该类已经加载过一次了,所以在初始化 e1 的时候不会再去加载静态变量了,那么e1所能初始化的代码如下:public int j=print("j");
{
print("构造块");
} public Test1(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++i;
++n;
}
所以你会看到首先打印出来的是:1:j i=0 n=02:构造块 i=1 n=13:t1 i=2 n=2
当public static ExeOrder1 e1 = new ExeOrder1("t1");这行代码执行完毕,返回并且继续执行main方法里面的类继续初始化。可以称之为 e1 的初始化已经结束,但是 e 还在初始化。
同理执行e2的初始化,e2初始化的时候,所执行的代码如下:public int j=print("j");
{
print("构造块");
} public Test1(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++i;
++n;
}
所以现在控制台打印的是:1:j i=0 n=02:构造块 i=1 n=13:t1 i=2 n=24:j i=3 n=35:构造块 i=4 n=46:t2 i=5 n=5
此时e2 执行完毕。继续返回执行e的初始化,然后依次执行:public static int i = print("i");public static int n=99;static{ //初始的时候静态块优先
print("静态块");
}public int j=print("j"); //然后便是非静态变量{
print("构造块");
}public ExeOrder1(String str){ //最后构造器
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++i;
++n;
}
所以最终看到的便是如下结果:
1:j i=0 n=02:构造块 i=1 n=13:t1 i=2 n=24:j i=3 n=35:构造块 i=4 n=46:t2 i=5 n=57:i i=6 n=68:静态块 i=7 n=999:j i=8 n=10010:构造块 i=9 n=10111:init i=10 n=102