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