国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

舉例說明Java中代碼塊的執行順序

2019-11-26 15:02:50
字體:
來源:轉載
供稿:網友

前言
    今天在看Android ContentProvider實現的時候,突然想到了Java類在new的過程中,靜態域、靜態塊、非靜態域、非靜態塊、構造函數的執行順序問題。其實這是一個很經典的問題,非常考察對Java基礎知識的掌握程度。很多面試過程中相信也有這樣的問題,趁著周末有時間復習一下。

結論
    這里先把整理好的結論拋給大家,然后我在寫個程序來驗證我們的結論。在Java類被new的過程中,執行順序如下:

  •     實現自身的靜態屬性和靜態代碼塊。(根據代碼出現的順序決定誰先執行)
  •     實現自身的非靜態屬性和非靜態代碼塊。
  •     執行自身的構造函數。

    在實現繼承的類被new的過程中,初始化執行順序如下:

  •     實現父類的公共靜態屬性和靜態塊級代碼。
  •     實現自身的靜態屬性和靜態塊級代碼。
  •     實現父類的非靜態屬性和非靜態代碼塊。
  •     執行父類的構造函數。
  •     實現自身的非靜態屬性和非靜態代碼塊。
  •     執行自身的構造函數。

    這里需要簡單的介紹一下靜態代碼塊和非靜態代碼塊。
1. 靜態代碼塊:

    static { 
    } 

2. 非靜態代碼塊

    { 
    } 

    靜態代碼塊和非靜態代碼塊的異同點如下:

  •     相同點:都是JVM加載類時且在構造函數執行之前執行,在類中都可以定義多個,一般在代碼塊中對一些static變量進行賦值。
  •     不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊 > 非靜態代碼塊)。靜態代碼塊只在第一次new時執行一次,之后不再執行。而非靜態代碼塊每new一次就執行一次。


驗證
    對于結論的最好驗證就是寫出代碼來進行結果證明。首先,來看一下無繼承的類初始化時的執行順序,代碼如下:

 

  public class InitOderTest {     public static String STATIC_FIELD = "靜態屬性";          // 靜態塊     static {       System.out.println(STATIC_FIELD);       System.out.println("靜態代碼塊");     }          public String field = "非靜態屬性";          // 非靜態塊     {       System.out.println(field);       System.out.println("非靜態代碼塊");     }        public InitOderTest() {       System.out.println("無參構造函數");     }          public static void main(String[] args) {       InitOderTest test = new InitOderTest();     }   } 

    執行結果:

  •     靜態屬性 
  •     靜態代碼塊 
  •     非靜態屬性 
  •     非靜態代碼塊 
  •     無參構造函數 

    接下來,我們驗證一下,當Java類實現繼承后,執行順序是否和我們的結論吻合。測試代碼如下:

   

 class ParentTest {     public static String PARENT_STATIC_FIELD = "父類-靜態屬性";        // 父類-靜態塊     static {       System.out.println(PARENT_STATIC_FIELD);       System.out.println("父類-靜態代碼塊");     }        public static String parentField = "父類-非靜態屬性";        // 父類-非靜態塊     {       System.out.println(parentField);       System.out.println("父類-非靜態代碼塊");     }        public ParentTest() {       System.out.println("父類―無參構造函數");     }   }      public class InitOderTest extends ParentTest {     public static String STATIC_FIELD = "靜態屬性";        // 靜態塊     static {       System.out.println(STATIC_FIELD);       System.out.println("靜態代碼塊");     }        public String field = "非靜態屬性";        // 非靜態塊     {       System.out.println(field);       System.out.println("非靜態代碼塊");     }        public InitOderTest() {       System.out.println("無參構造函數");     }        public static void main(String[] args) {       InitOderTest test = new InitOderTest();     }   } 

    執行結果如下:

  •     父類-靜態屬性 
  •     父類-靜態代碼塊 
  •     靜態屬性 
  •     靜態代碼塊 
  •     父類-非靜態屬性 
  •     父類-非靜態代碼塊 
  •     父類―無參構造函數 
  •     非靜態屬性 
  •     非靜態代碼塊 
  •     無參構造函數
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汶上县| 拉孜县| 赤水市| 色达县| 丰原市| 五河县| 井陉县| 牙克石市| 祁连县| 合阳县| 讷河市| 南岸区| 靖远县| 新建县| 玛沁县| 伊川县| 宁化县| 张家港市| 九寨沟县| 都江堰市| 南昌市| 新晃| 新郑市| 闽清县| 衢州市| 南部县| 静安区| 苗栗县| 永寿县| 水富县| 历史| 石泉县| 周口市| 武山县| 菏泽市| 扶余县| 若羌县| 江门市| 东乡族自治县| 红安县| 梁平县|