code
public class TestClassInitial {
public static void main(String[] args){
Beetle b=new Beetle();
}
}
class Insect{
private int i=9;
protected int j;
Insect(){
System.out.println("i="+i+", j="+j);
j=39;
}
{
System.out.println(" insect");
}
private static int x1=printStatic("static Insect.x1 init");
static{
System.out.println(" static insect");
}
public static int printStatic(String string) {
System.out.println(string);
return 1;
}
}
class Beetle extends Insect{
private String k="k";
static{
System.out.println("static Beetle");
}
{
System.out.println("Beetle");
}
public Beetle(){
System.out.println("construct Beetle");
}
private static int x2=Insect.printStatic("beetle x2");
}
总结流程:
- 加载main所在方法类
- 如果该类有基类,则加载基类,持续下去
- 反过来一个个加载static修饰的成员变量或者代码块 顺序从上到下
- 从基类开始,一次次加载非静态成员,一个类中从上到下,然后到初始化构造函数
- 子类加载非静态成员,然后构造函数
- 动态代码快在构造函数之前发生
运行结果
static Insect.x1 init
static insect
static Beetle
beetle x2
insect
i=9, j=0
Beetle
construct Beetle