static代碼塊晌端、構(gòu)造代碼塊、構(gòu)造函數(shù)以及Java類初始化順序

順序:
父類靜態(tài)塊-->子類靜態(tài)塊--> main方法-->父類構(gòu)造代碼塊 -->父類構(gòu)造函數(shù)-->子類構(gòu)造代碼塊-->子類構(gòu)造函數(shù)恬砂,同一級(jí)別代碼塊按順序執(zhí)行咧纠。

這幾個(gè)名詞體現(xiàn)在代碼中,如下:

class Study {
    public Study(){
        System.out.println("構(gòu)造函數(shù)");    
    }
    {
        System.out.println("構(gòu)造代碼塊");    
    }
    static {
        System.out.println("靜態(tài)代碼塊");        
    }
}

靜態(tài)代碼塊和代碼塊的區(qū)別在于:
靜態(tài)代碼塊只執(zhí)行一次泻骤,代碼塊每次創(chuàng)建該對(duì)象的時(shí)候都會(huì)執(zhí)行一次漆羔。
執(zhí)行順序:
靜態(tài)變量梧奢,main方法,構(gòu)造塊演痒,構(gòu)造函數(shù)亲轨。

我覺得對(duì)于這個(gè)簡單明了的理解就是上代碼。

普通情況

  • 執(zhí)行順序嫡霞,靜態(tài)變量-->靜態(tài)塊--> main方法
public class Demo {    
    static int a = 10;
    static {
         System.out.println("a----"+a);
         System.out.println("A的靜態(tài)代碼塊");
    }
    public static void main(String[] args){
         System.out.println("main");
    }
}

輸出結(jié)果:
a----10
A的靜態(tài)代碼塊
main
  • main方法 --> 非靜態(tài)變量--> 構(gòu)造代碼塊 --> 構(gòu)造函數(shù)
public class Demo { 
    static int a = 10;
    static {
         System.out.println("a----"+a);
         System.out.println("A的靜態(tài)代碼塊");
    }
    int b = 20;
    {
         System.out.println("b----"+b);
         System.out.println("A的構(gòu)造代碼塊");
    }
    Demo(){
        System.out.println("構(gòu)造函數(shù)");
    }
    public static void main(String[] args){
         System.out.println("main");
         new Demo();
    }
}

輸出結(jié)果:
a----10
A的靜態(tài)代碼塊
main
b----20
A的構(gòu)造代碼塊
構(gòu)造函數(shù)
  • 靜態(tài)構(gòu)造塊只執(zhí)行一次瓶埋,構(gòu)造代碼塊每次new對(duì)象的時(shí)候都會(huì)調(diào)用。
public class Demo { 

    static {
        System.out.println("子類的靜態(tài)代碼塊");
    }
    
    {
        System.out.println("子類的構(gòu)造代碼塊");
    }
    Demo(){
        System.out.println("子類構(gòu)造函數(shù)");
    }

    public static void main(String[] args){
        new Demo();
        new Demo();
    }
}

結(jié)果:
子類的靜態(tài)代碼塊
子類的構(gòu)造代碼塊
子類構(gòu)造函數(shù)
子類的構(gòu)造代碼塊
子類構(gòu)造函數(shù)

為什么只靜態(tài)代碼塊只執(zhí)行了一次诊沪,普通代碼塊執(zhí)行了多次养筒?
靜態(tài)變量被所有的對(duì)象所共享,在內(nèi)存中只有一個(gè)副本端姚,它當(dāng)且僅當(dāng)在類初次加載時(shí)會(huì)被初始化晕粪。而非靜態(tài)變量是對(duì)象所擁有的,在創(chuàng)建對(duì)象的時(shí)候被初始化渐裸,存在多個(gè)副本巫湘,各個(gè)對(duì)象擁有的副本互不影響。

繼承情況

  • 父類靜態(tài)塊-->子類靜態(tài)塊--> main方法-->父類構(gòu)造代碼塊 -->父類構(gòu)造函數(shù)-->子類構(gòu)造代碼塊--> 子類構(gòu)造函數(shù)
class Super {
    static {
        System.out.println("Super的靜態(tài)代碼塊");
    }
    {
        System.out.println("Super的構(gòu)造代碼塊");
    }
    Super(){
        System.out.println("Super構(gòu)造函數(shù)");
    }

}

public class Demo extends Super{
    static {
        System.out.println("子類的靜態(tài)代碼塊1");
    }

    static {
        System.out.println("子類的靜態(tài)代碼塊2");
    }
    
    {
        System.out.println("子類的構(gòu)造代碼塊");
    }
    Demo(){
        System.out.println("子類構(gòu)造函數(shù)");
    }

    public static void main(String[] args){
        System.out.println("main");
        new Demo();
    }

}

輸出:
Super的靜態(tài)代碼塊
子類的靜態(tài)代碼塊1
子類的靜態(tài)代碼塊2
main
Super的構(gòu)造代碼塊
Super構(gòu)造函數(shù)
子類的構(gòu)造代碼塊
子類構(gòu)造函數(shù)

為什么會(huì)調(diào)用父類的構(gòu)造函數(shù)呢昏鹃?命名沒有調(diào)用過Super方法尚氛。
-->子類構(gòu)造函數(shù)會(huì)默認(rèn)調(diào)用一下父類的無參構(gòu)造函數(shù),可以給父類構(gòu)造函數(shù)加個(gè)參數(shù)試一下洞渤≡乃唬基礎(chǔ)知識(shí)不能忘啊。

加載過程:
在執(zhí)行開始载迄,先要尋找到main方法讯柔,因?yàn)閙ain方法是程序的入口,但是在執(zhí)行main方法之前护昧,必須先加載Demo類魂迄,而在加載Demo類的時(shí)候發(fā)現(xiàn)Demo類繼承自Super類,因此會(huì)轉(zhuǎn)去先加載Super類惋耙,在加載Super類的時(shí)候捣炬,發(fā)現(xiàn)有static塊,便執(zhí)行了static塊绽榛。在Super類加載完成之后湿酸,便繼續(xù)加載Demo類,然后發(fā)現(xiàn)Demo類中也有static塊蒜田,便執(zhí)行static塊稿械。在加載完所需的類之后,便開始執(zhí)行main方法冲粤。在main方法中執(zhí)行new Demo()的時(shí)候會(huì)先調(diào)用父類的構(gòu)造器美莫,然后再調(diào)用自身的構(gòu)造器页眯。因此,便出現(xiàn)了上面的輸出結(jié)果厢呵。
同時(shí)存在兩個(gè)代碼塊的時(shí)候窝撵,按代碼順序執(zhí)行。

題目

public class Demo {
    private static Demo test = new Demo();
    //靜態(tài)變量sta1    未賦予初始值
    public static int sta1;
    //靜態(tài)變量sta1    賦予初始值20
    public static int sta2 = 20;
    //構(gòu)造方法中對(duì)于靜態(tài)變量賦值
    private Demo() {
        sta1 ++ ;
        sta2 ++ ;
    }
    public static void main(String[] args) {
        System.out.println(Demo.sta1);
        System.out.println(Demo.sta2);
    }
}

print:
1
20
res:都是static就順序執(zhí)行襟铭,執(zhí)行完后碌奉,讓sta1和2自增,完后sta2又賦值為20寒砖。
補(bǔ)充一個(gè)demo

構(gòu)造代碼塊和對(duì)象綁定赐劣,簡單講,不new對(duì)象不走構(gòu)造代碼塊


public class Animal {
    private static int k;
    static{
        System.out.println("父類的靜態(tài)方法");
    }
    {
        System.out.println("執(zhí)行父類的構(gòu)造代碼塊");
    }
    public Animal(){
        System.out.println("執(zhí)行父類的構(gòu)造方法");
    }
    public static void main(String[] args) {
        System.out.println(Animal.k);
    }
}
print:
父類的靜態(tài)方法
0

這個(gè)鏈接里面也有幾道燒腦的題目哩都,反正就按順序來就好了魁兼,但是寫代碼的時(shí)候最好還是以大部分人能看明白為主,要不然光這個(gè)點(diǎn)很多人就得進(jìn)坑漠嵌,而且時(shí)間久了自己也會(huì)記不牢咐汞。
https://www.cnblogs.com/chihirotan/p/6043442.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市儒鹿,隨后出現(xiàn)的幾起案子化撕,更是在濱河造成了極大的恐慌,老刑警劉巖约炎,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植阴,死亡現(xiàn)場離奇詭異,居然都是意外死亡章钾,警方通過查閱死者的電腦和手機(jī)墙贱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門热芹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贱傀,“玉大人,你說我怎么就攤上這事伊脓「” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵报腔,是天一觀的道長株搔。 經(jīng)常有香客問我,道長纯蛾,這世上最難降的妖魔是什么纤房? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮翻诉,結(jié)果婚禮上炮姨,老公的妹妹穿的比我還像新娘捌刮。我一直安慰自己,他們只是感情好舒岸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布绅作。 她就那樣靜靜地躺著,像睡著了一般蛾派。 火紅的嫁衣襯著肌膚如雪俄认。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天洪乍,我揣著相機(jī)與錄音眯杏,去河邊找鬼。 笑死壳澳,一個(gè)胖子當(dāng)著我的面吹牛役拴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钾埂,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼河闰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了褥紫?” 一聲冷哼從身側(cè)響起姜性,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎髓考,沒想到半個(gè)月后部念,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氨菇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年儡炼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片查蓉。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乌询,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豌研,到底是詐尸還是另有隱情妹田,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布鹃共,位于F島的核電站鬼佣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霜浴。R本人自食惡果不足惜晶衷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晌纫,春花似錦驻龟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凌蔬,卻和暖如春露懒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂心。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工懈词, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辩诞。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓坎弯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親译暂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抠忘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容