在運作一個Java程式時,分為類加載過程和執行個體化過程,即static修飾的代碼塊、屬性、聲明為類加載,類的普通屬性、代碼塊、構造器為執行個體化過程。其中類加載的代碼屬于整個類,隻執行一次;而執行個體化過程中的代碼屬于執行個體化對象的,每次執行個體化過程都執行。
執行順序類加載先于執行個體化執行,執行過程自上而下按順序執行。如果父類有類加載代碼,先按前面的規則執行父類的類加載代碼,執行完後再執行自己的類加載代碼。如果類加載過程中執行個體化了對象,則暫停類加載過程,執行執行個體化代碼,執行個體化完成後繼續執行未執行完的類加載代碼。
當類加載代碼執行完後,執行執行個體化代碼,執行個體化過程中不能執行類加載過程。執行個體化變量先自上而下按順序執行普通代碼塊、屬性,最後執行構造器,如果有父類就先按前面的規則執行父類的。
當執行完類加載和執行個體化代碼後,再去執行main方法裡的内容。
以下為驗證代碼:`
public class MyTest extends Test{
public static int x = count("靜态");
static {
System.out.println("靜态代碼塊1");
}
public static MyTest test1 = new MyTest("test1");
public static MyTest test2 = new MyTest("test2");
public static int n = count("非靜态");
public int a = count("");
{
System.out.println("普通代碼塊1");
}
static {
System.out.println("靜态代碼塊2");
}
public static int count(String string){
System.out.println("指派"+string+"變量");
return ;
}
public MyTest(String string){
System.out.println("構造器執行個體化"+string);
}
{
System.out.println("普通代碼塊2");
}
public static void main(String[] args) {
MyTest test3 = new MyTest("Mian");
}
}
class Test {
{
System.out.println("父類普通代碼塊");
}
}
運作結果