執(zhí)行順序
靜態(tài)代碼塊>main()方法>構(gòu)造方法>普通代碼塊
簡單的給大家分析一下,當(dāng)jvm加載類的時候是將類文件中的內(nèi)容一行一行的加載到內(nèi)存中的(除了實例變量藤抡,因為這是對象私有的)辫封,但不執(zhí)行任何語句硝枉,即使加載時有輸出語句也不會輸出廉丽。加載的時候把靜態(tài)成員變量,靜態(tài)代碼塊妻味,構(gòu)造代碼塊正压,靜態(tài)方法,加載到方法區(qū)的靜態(tài)部分弧可。把構(gòu)造方法蔑匣,非靜態(tài)方法加載到方法區(qū)的非靜態(tài)部分。
類文件加載好以后棕诵,開始執(zhí)行靜態(tài)代碼塊裁良,然后在堆中開辟內(nèi)存空間,分配內(nèi)存地址校套。接著開始在堆內(nèi)存中對實例變量進(jìn)行默認(rèn)初始化价脾,然后開始執(zhí)行構(gòu)造代碼塊,對對象進(jìn)行對應(yīng)的構(gòu)造代碼塊的初始化笛匙,最后進(jìn)行構(gòu)造函數(shù)的初始化侨把,對對象進(jìn)行構(gòu)造方法的初始化。
靜態(tài)代碼塊:在java中使用static關(guān)鍵字聲明的代碼塊妹孙。靜態(tài)塊用于初始化類秋柄,為類的屬性初始化。每個靜態(tài)代碼塊只會執(zhí)行一次蠢正。由于JVM在加載類時會執(zhí)行靜態(tài)代碼塊骇笔,所以靜態(tài)代碼塊先于主方法執(zhí)行。
如果類中包含多個靜態(tài)代碼塊嚣崭,那么將按照"先定義的代碼先執(zhí)行笨触,后定義的代碼后執(zhí)行"。
注意:1 靜態(tài)代碼塊不能存在于任何方法體內(nèi)雹舀。
2 靜態(tài)代碼塊不能直接訪問靜態(tài)實例變量和實例方法芦劣,需要通過類的實例對象來訪問。
1.靜態(tài)代碼塊是用來給類做初始化的说榆,類加載是就會被執(zhí)行虚吟,(注意它只被執(zhí)行了一次);
? ? ? ?2.構(gòu)造代碼塊是用來給對象做初始化的签财,每次創(chuàng)建對象都會被執(zhí)行稍味,而且優(yōu)先于構(gòu)造方法先執(zhí)行;
3.構(gòu)造方法是用來給對象進(jìn)行初始化的荠卷,每次創(chuàng)建對象就會選擇相應(yīng)的構(gòu)造方法執(zhí)行
? ? ? ?4.普通代碼是在方法里或者語句中出現(xiàn)的{}模庐,執(zhí)行方式由他們的出現(xiàn)順序決定,依次從上到下油宜,先出現(xiàn)先執(zhí)行掂碱;