對(duì)象的創(chuàng)建過(guò)程-構(gòu)造函數(shù)初始化(三)

我們知道距境,實(shí)例變量初始化和代碼塊初始化問(wèn)題在構(gòu)造函數(shù)執(zhí)行之前。
每個(gè)類至少都有一個(gè)構(gòu)造函數(shù)祭阀,在編譯生成字節(jié)碼時(shí)鹉戚,構(gòu)造函數(shù)會(huì)被命名成<init>方法,參數(shù)類弄和順序不變 专控。
我們知道抹凳,java在實(shí)例化類之前,必須先實(shí)例化其超類伦腐,以保存實(shí)例的完整性赢底。事實(shí)上,這一點(diǎn)是在構(gòu)造函數(shù)中保證的柏蘑,
構(gòu)造的函數(shù)的第一條語(yǔ)句必須是調(diào)用超類的語(yǔ)句或是類中定義的其他函數(shù)幸冻。如果我們沒(méi)有顯示地調(diào)用超類的構(gòu)造函數(shù),也沒(méi)有調(diào)用類中的其它構(gòu)造函數(shù)咳焚,
則編譯器會(huì)自動(dòng)為我們生成對(duì)超類構(gòu)造函數(shù)的調(diào)用洽损。如:

public class Student {
    public static void main(String[] args) {
        System.out.println(111);
    }
}

上面的語(yǔ)句沒(méi)有顯示地調(diào)用超類構(gòu)造函數(shù),但是我們可以查看編譯后的字節(jié)碼革半,編譯器自動(dòng)為我們生成了調(diào)用超類的代碼趁啸,如下:


image

上面紅色箭頭就是調(diào)用超類Object類的構(gòu)造函數(shù)强缘。

特別地,如果我們?cè)谝粋€(gè)構(gòu)造函數(shù)中調(diào)用另外一個(gè)構(gòu)造函數(shù)不傅,如下:

public class Student {
    private int i;
    /**
     * 在無(wú)參構(gòu)造函數(shù)中調(diào)用有參構(gòu)造函數(shù)
     * 對(duì)于這種情況旅掂,只允許在 Student(int i) 中調(diào)用超類的構(gòu)造函數(shù)
     */
    public Student() {
        //super();    //在這里調(diào)用父類構(gòu)造方法會(huì)報(bào)錯(cuò),
        this(1);
    }
    public Student(int i) {
        this.i = i;
    }
    public static void main(String[] args) {
        System.out.println(111);
    }
}

總結(jié):實(shí)例化一個(gè)類的對(duì)象的過(guò)程是一個(gè)典型的遞歸過(guò)程访娶,實(shí)例化類的對(duì)象時(shí)商虐,會(huì)先實(shí)例化該類的父類,
如果該父類還有父類崖疤,那么會(huì)一直往上遞歸直到Object類秘车,先實(shí)例化Object類,再往下遞歸實(shí)例化劫哼,直到目標(biāo)類叮趴。
實(shí)例化每個(gè)類時(shí),遵循如下順序权烧,先執(zhí)行實(shí)例變量初始化和實(shí)例代碼塊初始化眯亦,再執(zhí)行構(gòu)造函數(shù)初始化。
也就是説般码,編譯器會(huì)將實(shí)例變量和實(shí)例代碼塊放到類的構(gòu)造函數(shù)中去妻率,并且放到超類的調(diào)用構(gòu)造函數(shù)語(yǔ)句之后,構(gòu)造函數(shù)本身代碼之前 板祝。


類加載.png

綜合實(shí)例:

實(shí)例變量初始化宫静、實(shí)例代碼塊初始化以及構(gòu)造函數(shù)初始化

//父類
class Foo {
    int i = 1;
    Foo() {
        System.out.println(i);   //輸出2 ----(1)
        int x = getValue();
        System.out.println(x);  //輸出0,根據(jù)多態(tài)券时,調(diào)用的是子類的getValue()孤里,而此時(shí)子類的構(gòu)造函數(shù)還沒(méi)被調(diào)用 ----(2)
    }
    {
        i = 2;
    }
    protected int getValue() {
        return i;
    }
}
//子類
class Bar extends Foo {
    int j = 1;
    Bar() {
        j = 2;
    }
    {
        j = 3;
    }
    @Override
    protected int getValue() {
        return j;
    }
}
public class ConstructorExample {
    public static void main(String... args) {
        Bar bar = new Bar();
        System.out.println(bar.getValue());   //輸出2 ----(3)
    }
}

我們可以將Foo類的構(gòu)造函數(shù)和Bar類的構(gòu)造函數(shù)等價(jià)地分別變?yōu)槿缦滦问剑?/p>

 Foo() {
    i = 1;
    i = 2;
    System.out.println(i);   //輸出2 ----(1)
    int x = getValue();
    System.out.println(x);  //輸出0,根據(jù)多態(tài)橘洞,調(diào)用的是子類的getValue()扭粱,而此時(shí)子類的構(gòu)造函數(shù)還沒(méi)被調(diào)用 ----(2)
}

Bar() {
  Foo();
  j = 1;
  j = 3;
  j = 2;
}

在通過(guò)使用Bar類的構(gòu)造方法new一個(gè)Bar類的實(shí)例時(shí),首先會(huì)調(diào)用Foo類構(gòu)造函數(shù)震檩,因此(1)處輸出是2琢蛤,這從Foo類構(gòu)造函數(shù)的等價(jià)變換中可以直接看出。
(2)處輸出是0抛虏,為什么呢博其?因?yàn)樵趫?zhí)行Foo的構(gòu)造函數(shù)的過(guò)程中,由于Bar重載了Foo中的getValue方法迂猴,所以根據(jù)Java的多態(tài)特性可以知道慕淡,
其調(diào)用的getValue方法是被Bar重載的那個(gè)getValue方法。但由于這時(shí)Bar的構(gòu)造函數(shù)還沒(méi)有被執(zhí)行沸毁,因此此時(shí)j的值還是默認(rèn)值0峰髓,因此(2)處輸出是0傻寂。
最后,在執(zhí)行(3)處的代碼時(shí)携兵,由于bar對(duì)象已經(jīng)創(chuàng)建完成疾掰,所以此時(shí)再訪問(wèn)j的值時(shí),就得到了其初始化后的值2徐紧,這一點(diǎn)可以從Bar類構(gòu)造函數(shù)的等價(jià)變換中直接看出静檬。

參考:https://blog.csdn.net/justloveyou_/article/details/72466416

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市并级,隨后出現(xiàn)的幾起案子拂檩,更是在濱河造成了極大的恐慌,老刑警劉巖嘲碧,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稻励,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡愈涩,警方通過(guò)查閱死者的電腦和手機(jī)望抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钠署,“玉大人,你說(shuō)我怎么就攤上這事荒椭。” “怎么了趣惠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)味悄。 經(jīng)常有香客問(wèn)我草戈,道長(zhǎng)侍瑟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任涨颜,我火速辦了婚禮,結(jié)果婚禮上庭瑰,老公的妹妹穿的比我還像新娘星持。我一直安慰自己弹灭,他們只是感情好揪垄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布逻翁。 她就那樣靜靜地躺著饥努,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卢未。 梳的紋絲不亂的頭發(fā)上肪凛,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音辽社,去河邊找鬼伟墙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滴铅,可吹牛的內(nèi)容都是我干的戳葵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼汉匙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拱烁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起噩翠,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤戏自,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后伤锚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體擅笔,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年屯援,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猛们。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狞洋,死狀恐怖弯淘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吉懊,我是刑警寧澤庐橙,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站借嗽,受9級(jí)特大地震影響怕午,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淹魄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一郁惜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦兆蕉、人聲如沸羽戒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)易稠。三九已至,卻和暖如春包蓝,著一層夾襖步出監(jiān)牢的瞬間驶社,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工测萎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亡电,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓硅瞧,卻偏偏與公主長(zhǎng)得像份乒,于是被迫代替她去往敵國(guó)和親腕唧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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