關於靜態代碼塊和非靜態代碼塊執行順序(了解這些你就了解所有)


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方法執行了
父類非靜態代碼執行了
父類構造方法
子類非靜態代碼執行了
子類構造方法執行了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM