遇事不決,就百度,哈哈哈。
找到了一篇還不錯的文章 傳送門在此
詳情請傳送查看,重點內容如下:
1、執行順序
靜態代碼塊>構造代碼塊>構造函數>普通代碼塊
public class CodeBlock {
static{
System.out.println("靜態代碼塊");
}
{
System.out.println("構造代碼塊");
}
public CodeBlock(){
System.out.println("無參構造函數");
}
public void sayHello(){
{
System.out.println("普通代碼塊");
}
}
public static void main(String[] args) {
System.out.println("執行了main方法");
new CodeBlock().sayHello();;
System.out.println("---------------");
new CodeBlock().sayHello();;
}
}
反編譯生成的class文件:
執行結果:
2、父類和子類的執行順序
在這裏我們創建了兩個匿名對象,但是靜態代碼塊只是調用了一次。
對象的初始化順序:
首先執行父類靜態的內容,父類靜態的內容執行完畢後,接着去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有構造代碼塊,如果有就執行父類的構造代碼塊,父類的構造代碼塊執行完畢,接着執行父類的構造方法;父類的構造方法執行完畢之後,它接着去看子類有沒有構造代碼塊,如果有就執行子類的構造代碼塊。子類的構造代碼塊執行完畢再去執行子類的構造方法。
總之一句話,靜態代碼塊內容先執行,接着執行父類構造代碼塊和構造方法,然後執行子類構造代碼塊和構造方法。
父類:SuperClass.java
子類:SubClass.java
打印結果: