Java 程序初始化順序
Java程序的初始化一般遵循三個(gè)原則(優(yōu)先級(jí)依次遞減):
- 1,靜態(tài)對(duì)象(變量)優(yōu)先于非靜態(tài)對(duì)象(變量)初始化,其中,靜態(tài)對(duì)象(變量)只初始化一次,而非靜態(tài)對(duì)象(變量)可能會(huì)初始化很多次。
- 2,父類優(yōu)先于子類進(jìn)行初始化。
- 3,按照成員變量的定義順序進(jìn)行初始化。即使變量定義散布于方法定義之中,它們依然在任何方法被調(diào)用之前先初始化。
Java程序初始化工作可以在許多不同的代碼塊中完成(例如靜態(tài)代碼塊,構(gòu)造函數(shù)等),它們的執(zhí)行順序如下:
- 父類靜態(tài)變量
- 父類靜態(tài)代碼塊
- 子類靜態(tài)變量
- 子類靜態(tài)代碼塊
- 父類非靜態(tài)變量
- 父類非靜態(tài)代碼塊
- 父類構(gòu)造函數(shù)
- 子類非靜態(tài)變量
- 子類非靜態(tài)代碼塊
- 子類構(gòu)造函數(shù)。
下面給出一個(gè)不同模塊初始化時(shí)執(zhí)行順序的一個(gè)例子:
class Base{ ? ? ? ? ? ?static { ? ? ? ? ? ? ? ? System.out.println("Base static block"); ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ?public Base(){ ? ? ? ? ? ?System.out.println("Base constructor"); ? ? ? ? ? ?} ?public class Derived extends Base{ ? ? ? ? ? ?static{ ? ? ? ? ? System.out.println("Drevied static block"); ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? { ? ? ? ? ? System.out.println("Drevied ?block"); ? ? ? ? ? ?} ?public ?Derived(){ ? ? ? ? ? System.out.println("Drevied ?constructor"); ? ? ? ? ? } public static void main(String args[]){ ? ? ? ? ? ? ? ? new Derived(); ? ? ? ? ? } ? ? ? ? ? }
先自己利用上面給出的執(zhí)行順序進(jìn)行判斷:
程序的運(yùn)行結(jié)果為:
Base static block
Derived static block
Base block
Base constructor
Derived block
Derived constructor
怎么樣,運(yùn)行結(jié)果是否與你的結(jié)果一致呢?
最后,我們?cè)賮砜匆坏烂嬖囌骖}:
下列代碼運(yùn)行結(jié)果是什么?
? class B extends Object{ ? ? ? ? ? static{ ? ? ? ? ? System.out.println("Load B1"); ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ?public ?B(){ ? ? ? ? ? System.out.println("Create B"); ? ? ? ? ? } ? ? ? ? ? ?static{ ? ? ? ? ? System.out.println("Load B2"); ? ? ? ? ? ?} ? ? ? ? ? ?} class A extends B{ ? ? ? ? ? static{ ? ? ? ? ? System.out.println("Load A"); ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ?public ?A(){ ? ? ? ? ? System.out.println("Create A"); ? ? ? ? ? } ? ? ? ? ? } ? ? ? ? ? public class Testclass{ ? ? ? ? ? public static void main(String[ ] args){ ? ? ? ? ? ? ? ? ? ? ? ? new A(); ? ? ? ? ? } ? ? ? ? ? }
運(yùn)行結(jié)果是:
Load B1 LoadB2 Load A Create B Create A
在面試中出現(xiàn)的執(zhí)行順序的問題,無非也就是把上面的代碼再換幾個(gè)形式,但,萬變不離其宗,只要掌握它的執(zhí)行順序的規(guī)律,所有問題就都可以迎刃而解了
到此這篇關(guān)于Java 程序初始化順序的文章就介紹到這了,更多相關(guān)Java程序初始化順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java的Array,List和byte[],String相互轉(zhuǎn)換的方法你了解嘛
這篇文章主要為大家詳細(xì)介紹了java的Array,List和byte[],String相互轉(zhuǎn)換的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02Spring Boot教程之利用ActiveMQ實(shí)現(xiàn)延遲消息
這篇文章主要給大家介紹了關(guān)于Spring Boot教程之利用ActiveMQ實(shí)現(xiàn)延遲消息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11使用注解@Validated效驗(yàn)VO參數(shù)是否合規(guī)
這篇文章主要為大家介紹了使用注解@Validated效驗(yàn)VO參數(shù)是否合規(guī)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Java即將引入新對(duì)象類型來解決內(nèi)存使用問題
這篇文章主要介紹了Java即將引入新對(duì)象類型來解決內(nèi)存使用問題,文章通過圍繞主題的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05Java中的字節(jié),字符輸出流與字節(jié)和字符輸入流的簡(jiǎn)單理解
這篇文章主要介紹了java 字節(jié)流和字符流的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-07-07SpringBoot 創(chuàng)建web項(xiàng)目并部署到外部Tomcat
本篇文章主要介紹了SpringBoot 創(chuàng)建web項(xiàng)目并部署到外部Tomcat,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06利用 filter 機(jī)制給靜態(tài)資源 url 加上時(shí)間戳,來防止js和css文件的緩存問題
這篇文章主要介紹了利用 filter 機(jī)制給靜態(tài)資源 url 加上時(shí)間戳,來防止js和css文件的緩存問題的相關(guān)資料,需要的朋友可以參考下2016-05-05