java静态初始化的执行顺序
//啥话不说,先上代码
public class Demo2 {
public static int k = 0;
public static Demo2 t1 = new Demo2("t1");
public static Demo2 t2 = new Demo2("t2");
public static int i = print("i");
public static int j = print("j");
public static int n = 99;
// 下面的代码属于构造代码块
{
print("constructor code");
}
// 下面的代码属于静态代码块
static {
print("static code");
}
public static int print(String s) {
System.out.println("i="+i +" "+s+ " k=" + k + " n=" + n + " j=" + j);
++i; ++k; ++n; return i;
}
public Demo2(String string) {
print(string);
}
public static void main(String[] args) {
Demo2 d=new Demo2("T");
}
}
/执行结果如下
i=0 constructor code k=0 n=0 j=0
i=1 t1 k=1 n=1 j=0
i=2 constructor code k=2 n=2 j=0
i=3 t2 k=3 n=3 j=0
i=4 i k=4 n=4 j=0
i=5 j k=5 n=5 j=0
i=6 static code k=6 n=99 j=6
i=7 constructor code k=7 n=100 j=6
i=8 T k=8 n=101 j=6
执行步骤:从上到下依次初始化每个static修饰的语句或者静态代码块,最后再执行main方法
- 执行public static int k = 0;
- 执行public static Demo2 t1 = new Demo2(“t1”);
- 对象初始化要先执行非静态代码块print(“constructor code”);
- 再找到 print(String s) 方法,打印i=0 constructor code k=0 n=0 j=0
- 执行构造方法中的 print(t1) 方法,打印i=1 t1 k=1 n=1 j=0
- 执行public static Demo2 t2 = new Demo2(“t2”); 打印
i=2 constructor code k=2 n=2 j=0
i=3 t2 k=3 n=3 j=0 - 执行public static int i = print(“i”); public static int j = print(“j”);
打印i=4 i k=4 n=4 j=0
i=5 j k=5 n=5 j=0 - 执行 public static int n = 99;
- 执行static {print(“static code”);}
打印i=6 static code k=6 n=99 j=6 - main函数调用 new Demo2(”T”) 打印
i=7 constructor code k=7 n=100 j=6
i=8 T k=8 n=101 j=6