public class Father {
public static final Father ff = new Father();
static{
System.out.println("父類靜態代碼執行了");
}
{
System.out.println("父類非靜態代碼執行了");
}
Father(){
System.out.println("父類構造方法");
}
}
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方法執行了");
new Son();
}
}
分析思路(核心靜態代碼塊是隨着類的加載而加載,而且只執行一次,非靜態代碼塊優先於構造代碼塊,執行是隨着對象的創建而執行的)
son這個類繼承了father類,在加載son這個類的時候會先加載father這個類,執行的順序是從上到下,所有先執行father類中創建對象,創建對象會先執行father類非靜態代碼塊,然后在執行father構造方法,之后執行father類靜態代碼塊(隨着類的加載而加載,而且只加載一次),
然后回到son類,先執行son類的靜態代碼,在執行main方法的輸出,之后new了一個son對象,因為有繼承關系,所以先執行father類非靜態方法,在執行father類構造方法,然后執行son類非靜態方法,在執行son類構造方法
最終執行順序如下:
父類非靜態代碼執行了
父類構造方法
父類靜態代碼執行了
子類靜態代碼執行了
子類main方法執行了
父類非靜態代碼執行了
父類構造方法
子類非靜態代碼執行了
子類構造方法執行了