国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - 舉例說明Java中代碼塊的執行順序

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

2019-12-30 14:08低調小一 JAVA教程

這篇文章主要介紹了舉例說明Java中代碼塊的執行順序,包括靜態屬性和非靜態屬性以及構造函數等相關的執行先后,需要的朋友可以參考下

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

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

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

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

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

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

    static { 
    } 

2. 非靜態代碼塊

    { 
    } 

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

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


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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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類實現繼承后,執行順序是否和我們的結論吻合。測試代碼如下:

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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();
   }
 }

    執行結果如下:

  •     父類-靜態屬性 
  •     父類-靜態代碼塊 
  •     靜態屬性 
  •     靜態代碼塊 
  •     父類-非靜態屬性 
  •     父類-非靜態代碼塊 
  •     父類—無參構造函數 
  •     非靜態屬性 
  •     非靜態代碼塊 
  •     無參構造函數

延伸 · 閱讀

精彩推薦
670
主站蜘蛛池模板: 中文字幕在线一区二区三区 | 国产免费一区 | 青青草亚洲 | 欧美色图一区 | 成人免费视频在线观看 | 日韩精品一区不卡 | 一本久久a久久精品亚洲 | 午夜精| 午夜激情视频在线观看 | 日本免费黄色 | 午夜影院在线观看 | 欧美日韩一 | 亚洲福利影院 | 日韩av一区二区在线观看 | 成人黄页在线观看 | 九九亚洲 | 国产免费黄色 | 欧美成人综合在线 | 欧美日韩精品一区二区在线观看 | 91视频免费在线看 | 在线一级视频 | 亚洲国产一区二区三区四区 | 色综久久 | 国产特黄一级 | 一区二区三区欧美在线 | 国产午夜精品一区二区三区免费 | 九九九在线 | 午夜国产视频 | 自拍偷拍一区 | 毛片哪里看| 青青草久久久 | 亚洲精品a | 亚洲性视频在线 | 成人av高清在线观看 | 成人在线免费观看小视频 | 精品国产乱码久久久久久牛牛 | 亚洲国产色视频 | 亚洲精品久久久一区二区三区 | 中文字幕日韩在线视频 | 成人片网址 | wwwav在线|