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