国产探花免费观看_亚洲丰满少妇自慰呻吟_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();     }   } 

    執行結果如下:

  •     父類-靜態屬性 
  •     父類-靜態代碼塊 
  •     靜態屬性 
  •     靜態代碼塊 
  •     父類-非靜態屬性 
  •     父類-非靜態代碼塊 
  •     父類―無參構造函數 
  •     非靜態屬性 
  •     非靜態代碼塊 
  •     無參構造函數
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 漯河市| 湾仔区| 阳泉市| 体育| 万宁市| 横峰县| 五指山市| 无棣县| 新干县| 内丘县| 饶阳县| 浦东新区| 东丰县| 洛阳市| 永丰县| 桃江县| 雷山县| 若羌县| 余庆县| 崇阳县| 金坛市| 辰溪县| 平凉市| 华蓥市| 安国市| 安徽省| 眉山市| 甘孜县| 军事| 平湖市| 凤山县| 民乐县| 延安市| 霸州市| 张家川| 南充市| 黔西县| 阿巴嘎旗| 兴和县| 亚东县| 大城县|