例题:
class Father{
private int i = test();
private static int j = method();
static {
System.out.print("(F1)");
}
Father(){
System.out.print("(F2)");
}
{
System.out.print("(F3)");
}
public int test() {
System.out.print("(F4)");
return 1;
}
public static int method() {
System.out.print("(F5)");
return 1;
}
}
class Son extends Father{
private int i = test();
private static int j = method();
static {
System.out.print("(S6)");
}
Son(){
System.out.print("(S7)");
}
{
System.out.print("(S8)");
}
public int test() {
System.out.print("(S9)");
return 1;
}
public static int method() {
System.out.print("(S10)");
return 1;
}
}
public class ClassInitOrder {
public static void main(String[] args) {
Son s1 = new Son(); // (F5)(F1)(S10)(S6)(S9)(F3)(F2)(S9)(S8)(S7)
System.out.println();
Son s2 = new Son(); // (S9)(F3)(F2)(S9)(S8)(S7)
}
}
summarize:
类初始化的过程:
- 一个类要创建实例需要先加载并初始化该类 (main方法所在的类需要先加载和初始化)
- 一个子类要初始化需要先初始化父类
-
一个类初始化就是执行<clinit>()方法
实例初始化的过程: