Java和C++中構(gòu)造函數(shù)的執(zhí)行順序

結(jié)論

C++

  1. 先執(zhí)行靜態(tài)成員的構(gòu)造函數(shù)呛哟,如果靜態(tài)成員只是在類定義中聲明了叠荠,而沒有實現(xiàn),是不用構(gòu)造的扫责。必須初始化后才執(zhí)行其構(gòu)造函數(shù)榛鼎。如:以下只有a會構(gòu)建
class Test {
    static A a;
    static B b;
}

A Test::a;

  1. 優(yōu)先執(zhí)行虛擬繼承的基類,任何虛擬繼承的基類鳖孤,構(gòu)造函數(shù)按照它們被虛擬繼承的順序構(gòu)造(不是初始化列表中的順序)

  2. 構(gòu)建其他父類者娱,構(gòu)造函數(shù)按照它們被繼承的順序構(gòu)造(不是初始化列表中的順序)

  3. 構(gòu)建成員變量,任何成員對象的構(gòu)造函數(shù)按照它們聲明的順序構(gòu)造

  4. 類自己的構(gòu)造函數(shù)

Java

  1. 先執(zhí)行內(nèi)部靜態(tài)對象的構(gòu)造方法苏揣,如果有多個按定義的先后順序執(zhí)行黄鳍;靜態(tài)對象在構(gòu)造的時候也是也先執(zhí)行其內(nèi)部的靜態(tài)對象
  2. 調(diào)用super(...)方法,也就是調(diào)用父類的構(gòu)造方法(父類還有父類的話平匈,從最開始的基類開始調(diào)用)框沟。說明:如果沒有明顯指定調(diào)用父類自定義的構(gòu)造方法,那么編譯器會調(diào)用默認(rèn)的父類構(gòu)造方法super()吐葱。如果要調(diào)用父類自定義的構(gòu)造方法街望,要在子類的構(gòu)造方法中明確指定super(...)。
  3. 按聲明順序?qū)⒊蓡T引用對象變量初始化(其他成員變量初始化)
  4. 最后調(diào)用自身的構(gòu)造方法弟跑。

測試程序

C++

#include <iostream>
#include <string>
using namespace std;
 
//抽象類A
class A
{
public:
    A()
    {
        cout<<"抽象類A的構(gòu)造函數(shù)"<<endl;
    }
    //純虛函數(shù)fun
    virtual void fun1() = 0;
};
 
//抽象類B
class B
{
public:
    B()
    {
        cout<<"抽象類B的構(gòu)造函數(shù)"<<endl;
    }
    //純虛函數(shù)fun
    virtual void fun2() = 0;
};
 
//普通類C
class C
{
public:
    C()
    {
        cout<<"類C的構(gòu)造函數(shù)"<<endl;
    }
};
 
//普通類D
class D
{
public:
    D()
    {
        cout<<"類D的構(gòu)造函數(shù)"<<endl;
    }
};
 
//普通類C
class E
{
public:
    E()
    {
        cout<<"類E的構(gòu)造函數(shù)"<<endl;
    }
};
 
//普通類D
class F
{
public:
    F()
    {
        cout<<"類F的構(gòu)造函數(shù)"<<endl;
    }
};
 
//普通類D
class G
{
public:
    G()
    {
        cout<<"類G的構(gòu)造函數(shù)"<<endl;
    }
};
 
//普通類D
class H
{
public:
    H()
    {
        cout<<"類H的構(gòu)造函數(shù)"<<endl;
    }
};
//普通類D
class M
{
public:
    M()
    {
        cout<<"類M的構(gòu)造函數(shù)"<<endl;
    }
};
 
class Test: public A,public B,virtual public C,virtual public D,public E,public F
{
public:
    Test():B(),A(),D(),C(),F(),E()
    {
        cout<<"類Test的構(gòu)造函數(shù)"<<endl;
    }
    void fun1()
    {
    }
    void fun2()
    {
    }
private:
    G g;
    static H h;
    static M m;
};
 
H Test::h;
 
int main(int argc, char* argv[])
{
    Test test;
    return EXIT_SUCCESS;
}
  • 結(jié)果
類H的構(gòu)造函數(shù)
類C的構(gòu)造函數(shù)
類D的構(gòu)造函數(shù)
抽象類A的構(gòu)造函數(shù)
抽象類B的構(gòu)造函數(shù)
類E的構(gòu)造函數(shù)
類F的構(gòu)造函數(shù)
類G的構(gòu)造函數(shù)
類Test的構(gòu)造函數(shù)

Java

class Animal{
    String name;
    Animal() {
        System.out.println("class Animal");
    }
    Animal(String name){
        this.name = name;
        System.out.println(name + "  class Animal");
        printNumber();
    }
    
    public void printNumber(){
        
    }
}
 
class Fish extends Animal{
    Fish() {
        System.out.println("class Fish");
    }
}
 
class GoldFish extends Fish {
    GoldFish() {
        System.out.println("class GoldFish");
    }
}
 
class Cat {
    Cat(){
        System.out.println("class cat");
    }
}
 
class Rabbit {
    private static int number;
    private static Cat cat = new Cat();
    public Rabbit() {
        number++;
        System.out.println(number + "class rabbit");
    }
}
 
class Dog extends Animal{
    public int dogNumber;
    private GoldFish goldFish = new GoldFish();
    static  Rabbit blackRabbit = new Rabbit(); 
    static  Rabbit whiterabbit = new Rabbit(); 
    
    public Dog() {
        super("Tom");
        System.out.println("class Dog");
        dogNumber = 10;
        System.out.println("The dog's number is:" + dogNumber);
    }
    
    public void printNumber(){
        System.out.println("The dog's number is:" + dogNumber);
    }
}
 
public class TestInheritanceConstructor extends Animal {
    public static void main(String[] args){
        new Dog();  //Test the executive order of constructor 
    }
}
  • 結(jié)果
class cat 
1class rabbit
2class rabbit
Tom  class Animal
The dog's number is:0
class Animal
class Fish
class GoldFish
class Dog
The dog's number is:10
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灾前,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孟辑,更是在濱河造成了極大的恐慌哎甲,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饲嗽,死亡現(xiàn)場離奇詭異炭玫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)貌虾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門吞加,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事衔憨∫镀裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵践图,是天一觀的道長掺冠。 經(jīng)常有香客問我,道長码党,這世上最難降的妖魔是什么德崭? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮揖盘,結(jié)果婚禮上眉厨,老公的妹妹穿的比我還像新娘。我一直安慰自己扣讼,他們只是感情好缺猛,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椭符,像睡著了一般荔燎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上销钝,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天有咨,我揣著相機(jī)與錄音,去河邊找鬼蒸健。 笑死座享,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的似忧。 我是一名探鬼主播渣叛,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盯捌!你這毒婦竟也來了淳衙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饺著,失蹤者是張志新(化名)和其女友劉穎箫攀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幼衰,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡靴跛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渡嚣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梢睛。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肥印,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绝葡,到底是詐尸還是另有隱情竖独,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布挤牛,位于F島的核電站,受9級特大地震影響种蘸,放射性物質(zhì)發(fā)生泄漏墓赴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一航瞭、第九天 我趴在偏房一處隱蔽的房頂上張望诫硕。 院中可真熱鬧,春花似錦刊侯、人聲如沸章办。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藕届。三九已至,卻和暖如春亭饵,著一層夾襖步出監(jiān)牢的瞬間休偶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工辜羊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留踏兜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓八秃,卻偏偏與公主長得像碱妆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昔驱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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