不包含繼承時類中的靜態塊、靜態方法、非靜態方法、構造函數的執行順序:
<span style="font-size:18px;">package test;
/**
*
* 不含有繼承時,各種發法(靜態塊,靜態方法,構造方法,普通方法)的執行順序
* @author
*
*/
public class uExtend {
public static void test(){
System.out.println("父類--靜態方法"); //被子類的相同方法覆蓋
}
static {
System.out.println("父類--靜態代碼塊");
}
public uExtend() {
System.out.println("父類--構造函數");
}
{
System.out.println("父類--非靜態代碼塊");
}
public static void main(String[] args) {
uExtend.test();
new uExtend();
}
}
運行結果:
父類--靜態代碼塊
父類--靜態方法
父類--非靜態代碼塊
父類--構造函數
總結:
先執行靜態塊中的內容,其次判斷是否有靜態方法在new uExtend()之前執行,如果有的話,就先執行靜態方法(在執行構造方法之前先執行靜態方法),否則直接執行非靜態方法,之後執行構造方法。
如果new uExtend()方法位置在調用靜態方法之前,則靜態方法在執行完構造方法(new uExtend())之後再調用。