java 初始化順序

Father的靜態代碼塊
Son的靜態代碼塊
Father的非靜態代碼塊
Father的構造方法
Son的非靜態代碼塊
Son的構造方法
Father的非靜態代碼塊
Father的構造方法
Son的非靜態代碼塊
Son的構造方法java

靜態方法塊只執行一次函數

靜態方法塊在類加載時被執行,因此,只要類含有main函數,無論是否生成生成相應的對象,靜態代碼塊都會執行this

 

java規定,在執行構造函數以前必須執行父類的構造函數,直到這個類是java.lang.Object類的構造函數。
然而函數的入口是子類構造函數,所以任何構造函數第一句必須是執行父類構造函數,若是沒有添加super關鍵字,那麼編譯器會爲該構造函數第一句添加一個super()語句(你能夠這麼理解,固然編譯之後並非這樣)。若是有super關鍵字顯示的調用父類構造函數,就是用指定的那個父類構造函數,不然使用默認的無參數構造函數。也有一種狀況例外,就是存在this關鍵字,調用本類其它構造函數,可是按照遞歸調用,最終仍是會調用父類構造函數。
若是你繼承的父類沒有無參數構造函數,那麼你這個類第一句必須顯示的調用super關鍵字來調用父類對應的有參數構造函數,不然不能經過編譯。spa

 

 1 package chap1;
 2 
 3 class Father {
 4 
 5     static {
 6         System.out.println("Father的靜態代碼塊");
 7     }
 8 
 9     {
10         System.out.println("Father的非靜態代碼塊");
11     }
12 
13     public Father() {
14         System.out.println("Father的構造方法");
15     }
16 }
17 public class Son extends Father{
18 
19     static{
20         System.out.println("Son的靜態代碼塊");
21     }
22 
23     {
24         System.out.println("Son的非靜態代碼塊");
25     }
26 
27     public Son(){
28         System.out.println("Son的構造方法");
29     }
30 
31     public static void main(String[] args) {
32         Son son = new Son();
33         Son son2 = new Son();
34     }
35 }
相關文章
相關標籤/搜索