子類繼承父類的構(gòu)造函數(shù) 子類調(diào)用父類的構(gòu)造函數(shù)有什么用?
子類調(diào)用父類的構(gòu)造函數(shù)有什么用?比如,如果父類的構(gòu)造函數(shù)帶參數(shù),那子類的構(gòu)造函數(shù)里面第一句是super(…)【注:“…”指父類的的構(gòu)造函數(shù)的實餐】時,當(dāng)調(diào)用子類構(gòu)造函數(shù)時,會先調(diào)用父類構(gòu)造函數(shù),再調(diào)用
子類調(diào)用父類的構(gòu)造函數(shù)有什么用?
比如,如果父類的構(gòu)造函數(shù)帶參數(shù),那子類的構(gòu)造函數(shù)里面第一句是super(…)【注:“…”指父類的的構(gòu)造函數(shù)的實餐】時,當(dāng)調(diào)用子類構(gòu)造函數(shù)時,會先調(diào)用父類構(gòu)造函數(shù),再調(diào)用子類構(gòu)造函數(shù)。再如,子類和父類有同名但不同實現(xiàn)的成員,如果想調(diào)用的是父類的成員而不是子類的,則可以:super.成員。不會創(chuàng)建父類的實例。 如果可以創(chuàng)建父類實例,那么我可以舉一個反例來說明這是錯的:當(dāng)父類是抽象類,子類不是抽象類時,子類調(diào)用構(gòu)造函數(shù)時也會調(diào)用父類構(gòu)造函數(shù),就創(chuàng)建了子類和父類兩個實例。但是,抽象類是不能實例化的。矛盾,所以原假設(shè)錯誤。所以,父類不會被創(chuàng)建出一個實例。 理論上理解:new加上構(gòu)造函數(shù)時,才會創(chuàng)建一個對象(實例)。在調(diào)用子類構(gòu)造函數(shù)時,調(diào)用父類構(gòu)造函數(shù),是為了初始化子類從父類繼承過來的部分。這個過程沒有對父類用new,所以沒有對父類創(chuàng)建對象(實例)。
子類為什么要調(diào)用父類的構(gòu)造函數(shù)?
子類構(gòu)造器會默認(rèn)調(diào)用 父類的無參構(gòu)造器,如果父類沒有無參構(gòu)造器,則需在子類構(gòu)造器的第一行顯式地調(diào)用父類的其他構(gòu)造器。
其次,從繼承的思想來看,你繼承一個類,就相當(dāng)于擴展一個類,形成一個更為特殊的類,但經(jīng)常,我們需要將子類向上轉(zhuǎn)型為基類,以便使用或達(dá)到其他各種目的。
這時,如果你生成子類對象時沒有調(diào)用父類的構(gòu)造器,那么,我們在使用父類的一些成員變量的時候,就會報變量未初始化的錯誤。請記住,變量初始化總是在構(gòu)造器調(diào)用之前完成!
構(gòu)造一個對象,先調(diào)用其構(gòu)造方法,來初始化其成員函數(shù)和成員變量。子類擁有父的成員變量和成員方法,如果不調(diào)用,則從父類繼承而來的成員變量和成員方法得不到正確的初始化。
在java語言里如何在子類中調(diào)用父類的有參構(gòu)造函數(shù)?
如果你是想在子類的構(gòu)造函數(shù)中調(diào)用父類構(gòu)造函數(shù),則需要在子類的構(gòu)造函數(shù)的函數(shù)體第一行(注釋語句除外)使用:super(參數(shù)列表)的方式調(diào)用,該參數(shù)列表與父類有參構(gòu)造函數(shù)聲明的參數(shù)列表一致,如果你不是在子類構(gòu)造函數(shù)中調(diào)用,則無法直接調(diào)用父類構(gòu)造函數(shù),這時創(chuàng)建一個父類對象(通過你想調(diào)用的有參父類構(gòu)造函數(shù)創(chuàng)建),就間接調(diào)用了該構(gòu)造函數(shù)。
創(chuàng)建子類對象時,子類和父類的構(gòu)造函數(shù)執(zhí)行順序是什么?
繼承時構(gòu)造函數(shù)的調(diào)用順序: 1,如果繼承虛基類,先調(diào)用虛基類的構(gòu)造函數(shù),如果有多個虛基類,按順序調(diào)用。
2,如果繼承基類,調(diào)用基類的構(gòu)造函數(shù);如果有多個基類,按順序調(diào)用。3,如果類中定義了成員對象,調(diào)用成員對象的構(gòu)造函數(shù);如果有多個成員對象,則按成員對象定義的順序調(diào)用; 4,調(diào)用自身的構(gòu)造函數(shù); 析構(gòu)函數(shù)的調(diào)用順序與此相反。