一些混淆點
繼承與代碼塊執行順序
類的順序
public class Father {
public Father(){
System.out.println("--父類的無參構造函數--");
}
static{
System.out.println("--父類的靜態代碼塊--");
}
{
System.out.println("--父類的非靜態代碼塊--");
}
//加入一個main程序後
public static void main(String[] args) {
System.out.println("--Main函數執行--");
Father father=new Father();
}
}
執行結果如下圖
可見,靜態代碼塊在main函數之前執行,執行順序爲,靜態代碼塊>非靜態代碼塊>構造函數
靜態代碼塊在Main函數執行之前執行。
子父類的順序
public class Son extends Father {
static{
System.out.println("--子類的靜態代碼塊--");
}
{
System.out.println("--子類的非靜態代碼塊--");
}
Son(){
System.out.println("--子類的無參構造函數--");
}
public static void main(String[] args) {
System.out.println("--子類的Main函數執行了--");
Father father=new Father();
Son son=new Son();
}
}
執行結果如下圖
可見
1、new一個函數時先加載其父類,從非靜態代碼塊開始進行加載。順序:父類非靜態代碼塊>父類構造函數>子類非靜態代碼塊>子類構造函數。
2、加載一個類時從靜態代碼塊開始,從其父類開始加載。PS:靜態變量的定義與靜態代碼塊的執行與其在類中順序有關,依照從上到下順序。