代码以及加载过程
public class StaticTest {
// 类加载
public static int k = 0; // k=0(print自加1)
// static new ...("t1") 调用所有非静态方法
public static StaticTest t1 = new StaticTest("t1");// print("i")
//1* k=1 out:[1:j i=0 n=0] n=1 i=1
public static StaticTest t2 = new StaticTest("t2");// print("构造块")
public static int i = print("i"); //2* k=2 out:[2:构造块 i=1 n=1] n=2 i=2
public static int n = 99; // public StaticTest("t1")
//3* k=3 out:[3:t1 i=2 n=2] n=3 i=3
public int j = print("j"); // static new ...("t2") 调用所有非静态方法
// print("j")
{ //4* k=4 out:[4:j i=3 n=3] n=4 i=4
print("构造快"); // print("构造块")
} //5* k=5 out:[5:构造块 i=4 n=4] n=5 i=5
// public StaticTest("t2")
static{ //6* k=6 out:[6:t2 i=5 n=5] n=6 i=6
print("静态块"); // static int i = print("i")
} // print("i")
//7* k=7 out:[7:i i=6 n=6] n=7 i=7
public StaticTest(String str) { // static int n=99
System.out.println((++k)+":"+str+" i="+i+" n="+n); // n=99
++n; // static {print("静态块")}
++i; // print("静态块")
} //8* k=8 out:[8:静态块 i=7 n=99] n=100 i=8
// 实例化
public static int print(String str) { // int j = print("j")
System.out.println((++k)+":"+str+" i="+i+" n="+n); // print("j")
++i; //9* k=9 out:[9:j i=8 n=100] n=101 i=9
return ++n; // {print("构造块")}
} // print("构造块")
//10* k=10 out:[10:构造块 i=9 n=101] n=102 i=10
public static void main(String[] args) { // new StaticTest("init")
StaticTest t = new StaticTest("init"); //11* k=11 out:[11:init i=10 n=102] n=103 i=11
} //
}
总结:
类加载 -> 实例化
类加载: 静态变量 静态代码块按顺序执行
实例化: 非静态变量 非静态代码块按顺序执行 -> 构造函数