举例说明Java中代码块的执行顺序
生活随笔
收集整理的這篇文章主要介紹了
举例说明Java中代码块的执行顺序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前些天發(fā)現(xiàn)了一個巨牛的人工智能學習網(wǎng)站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到教程。
結論
??? 這里先把整理好的結論拋給大家,然后我在寫個程序來驗證我們的結論。在Java類被new的過程中,執(zhí)行順序如下:
- ??? 實現(xiàn)自身的靜態(tài)屬性和靜態(tài)代碼塊。(根據(jù)代碼出現(xiàn)的順序決定誰先執(zhí)行)
- ??? 實現(xiàn)自身的非靜態(tài)屬性和非靜態(tài)代碼塊。
- ??? 執(zhí)行自身的構造函數(shù)。
??? 在實現(xiàn)繼承的類被new的過程中,初始化執(zhí)行順序如下:
- ??? 實現(xiàn)父類的公共靜態(tài)屬性和靜態(tài)塊級代碼。
- ??? 實現(xiàn)自身的靜態(tài)屬性和靜態(tài)塊級代碼。
- ??? 實現(xiàn)父類的非靜態(tài)屬性和非靜態(tài)代碼塊。
- ??? 執(zhí)行父類的構造函數(shù)。
- ??? 實現(xiàn)自身的非靜態(tài)屬性和非靜態(tài)代碼塊。
- ??? 執(zhí)行自身的構造函數(shù)。
??? 這里需要簡單的介紹一下靜態(tài)代碼塊和非靜態(tài)代碼塊。
1. 靜態(tài)代碼塊:
??? static {??
??? }?
2. 非靜態(tài)代碼塊
??? {??
??? }?
??? 靜態(tài)代碼塊和非靜態(tài)代碼塊的異同點如下:
- ??? 相同點:都是JVM加載類時且在構造函數(shù)執(zhí)行之前執(zhí)行,在類中都可以定義多個,一般在代碼塊中對一些static變量進行賦值。
- ??? 不同點:靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊 > 非靜態(tài)代碼塊)。靜態(tài)代碼塊只在第一次new時執(zhí)行一次,之后不再執(zhí)行。而非靜態(tài)代碼塊每new一次就執(zhí)行一次。
驗證
??? 對于結論的最好驗證就是寫出代碼來進行結果證明。首先,來看一下無繼承的類初始化時的執(zhí)行順序,代碼如下:
?
?| 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 | publicclass InitOderTest { ??publicstatic String STATIC_FIELD = "靜態(tài)屬性"; ???? ??// 靜態(tài)塊 ??static{ ????System.out.println(STATIC_FIELD); ????System.out.println("靜態(tài)代碼塊"); ??} ???? ??publicString field = "非靜態(tài)屬性"; ???? ??// 非靜態(tài)塊 ??{ ????System.out.println(field); ????System.out.println("非靜態(tài)代碼塊"); ??} ?? ??publicInitOderTest() { ????System.out.println("無參構造函數(shù)"); ??} ???? ??publicstatic void main(String[] args) { ????InitOderTest test = newInitOderTest(); ??} } |
??? 執(zhí)行結果:
- ??? 靜態(tài)屬性?
- ??? 靜態(tài)代碼塊?
- ??? 非靜態(tài)屬性?
- ??? 非靜態(tài)代碼塊?
- ??? 無參構造函數(shù)?
??? 接下來,我們驗證一下,當Java類實現(xiàn)繼承后,執(zhí)行順序是否和我們的結論吻合。測試代碼如下:
???
?| 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 | classParentTest { ???publicstatic String PARENT_STATIC_FIELD = "父類-靜態(tài)屬性"; ??? ???// 父類-靜態(tài)塊 ???static{ ?????System.out.println(PARENT_STATIC_FIELD); ?????System.out.println("父類-靜態(tài)代碼塊"); ???} ??? ???publicstatic String parentField = "父類-非靜態(tài)屬性"; ??? ???// 父類-非靜態(tài)塊 ???{ ?????System.out.println(parentField); ?????System.out.println("父類-非靜態(tài)代碼塊"); ???} ??? ???publicParentTest() { ?????System.out.println("父類—無參構造函數(shù)"); ???} ?} ??? ?publicclass InitOderTest extendsParentTest { ???publicstatic String STATIC_FIELD = "靜態(tài)屬性"; ??? ???// 靜態(tài)塊 ???static{ ?????System.out.println(STATIC_FIELD); ?????System.out.println("靜態(tài)代碼塊"); ???} ??? ???publicString field = "非靜態(tài)屬性"; ??? ???// 非靜態(tài)塊 ???{ ?????System.out.println(field); ?????System.out.println("非靜態(tài)代碼塊"); ???} ??? ???publicInitOderTest() { ?????System.out.println("無參構造函數(shù)"); ???} ??? ???publicstatic void main(String[] args) { ?????InitOderTest test = newInitOderTest(); ???} ?} |
??? 執(zhí)行結果如下:
- ??? 父類-靜態(tài)屬性?
- ??? 父類-靜態(tài)代碼塊?
- ??? 靜態(tài)屬性?
- ??? 靜態(tài)代碼塊?
- ??? 父類-非靜態(tài)屬性?
- ??? 父類-非靜態(tài)代碼塊?
- ??? 父類—無參構造函數(shù)?
- ??? 非靜態(tài)屬性?
- ??? 非靜態(tài)代碼塊?
- ??? 無參構造函數(shù)
總結
以上是生活随笔為你收集整理的举例说明Java中代码块的执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle数据库的测试用户Scott的
- 下一篇: SubSonic中RecordBaseT