C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序
一、簡介
當(dāng)我們沒有在子類構(gòu)造函數(shù)中寫上 base(),默認(rèn)會(huì)先調(diào)用父類中無參的構(gòu)造函數(shù),再調(diào)用子類。
當(dāng)在有參構(gòu)造函數(shù)后寫上base時(shí),只調(diào)用子類構(gòu)造函數(shù)中有參的構(gòu)造函數(shù),隱藏父類無參構(gòu)造函數(shù)。
二、代碼案例
父類代碼:
#region 父類 /// <summary> /// 測試構(gòu)造函數(shù)——需要被構(gòu)造類 Fu /// </summary> class Fu { private int x;//一個(gè)簡單的私有字段 /// <summary> /// 構(gòu)造函數(shù) /// </summary> public Fu() { Console.WriteLine("會(huì)先調(diào)用這里:這是父類"); } /// <summary> /// 父類中的有參構(gòu)造方法 /// </summary> /// <param name="x"></param> public Fu(int x) { this.x = x; Console.WriteLine("x賦值完成"); } /// <summary> /// 父類構(gòu)造C函數(shù) /// </summary> /// <param name="x"></param> /// <param name="b"></param> /// <param name="c"></param> public Fu(int x, int b, string c) { this.x = x; Console.WriteLine("x賦值完成" + x + b + c); } /// <summary> /// 具有7個(gè)參數(shù)的構(gòu)造函數(shù) /// </summary> /// <param name="a"></param> /// <param name="a1"></param> /// <param name="a2"></param> /// <param name="a3"></param> /// <param name="a4"></param> /// <param name="a6"></param> /// <param name="a5"></param> public Fu(int a, int a1, int a2, int a3, int a4, int a6, int a5) { Console.WriteLine("最長參數(shù)構(gòu)造運(yùn)行"); Console.WriteLine(a + "|" + a1 + "|" + a2 + "|" + a3 + "|" + a4 + "|" + a5 + "|" + a6 + "|"); //在函數(shù)中讓傳入?yún)?shù)對(duì)Fu類對(duì)象進(jìn)行初始化 //例如有如下多個(gè)私有字段,在類對(duì)象初始化的時(shí)候,對(duì)其變量初始化。用構(gòu)造函數(shù)最為簡單 this.a = a; //傳入?yún)?shù),在對(duì)象實(shí)例化后,對(duì)其私有變量進(jìn)行賦值操作 this.a1 = a; this.a2 = a; this.a3 = a; this.a4 = a; this.a5 = a; this.a6 = a; } private int a; private int a1; private int a2; private int a3; private int a4; private int a5; private int a6; } #endregion
子類代碼:
#region 子類 /// <summary> /// 派生類繼承父類 /// </summary> class Derived : Fu { /// <summary> /// 會(huì)先調(diào)用父類的構(gòu)造函數(shù),然后再調(diào)用子類這邊的有參構(gòu)造函數(shù) /// </summary> //先調(diào)用父類無參,再調(diào)用子類無參 //當(dāng)我們沒有在子類構(gòu)造函數(shù)中寫上 base(),默認(rèn)會(huì)先調(diào)用父類中無參的構(gòu)造函數(shù),再調(diào)用子類。 public Derived() //: base() //重新構(gòu)造 :調(diào)用父類中無參的構(gòu)造函數(shù),在這里寫不寫調(diào)用結(jié)果一致 { Console.WriteLine("這是派生類-無參-構(gòu)造函數(shù)"); } private int y; /// <summary> /// 構(gòu)造函數(shù) /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// 當(dāng)我們沒有在子類構(gòu)造函數(shù)中 寫上 base(),默認(rèn)會(huì)先調(diào)用父類中無參的構(gòu)造函數(shù) /// 當(dāng)在有參構(gòu)造函數(shù)后寫上base時(shí),只調(diào)用子類構(gòu)造函數(shù)中有參的構(gòu)造函數(shù),隱藏父類無參構(gòu)造函數(shù) public Derived(int x, int y) /*: base(x)*/ { this.y = y; Console.WriteLine("這是y賦值完成"); } /// <summary> /// 多參數(shù) /// </summary> /// <param name="x"></param> /// <param name="a"></param> public Derived(int x, string a)// : base(x, x, x, x, x, x, x) //這里寫了 base 會(huì)先調(diào)用父類,再調(diào)用當(dāng)前子類進(jìn)行構(gòu)造 { y = x; Console.WriteLine(a + "第三方法"); } } #endregion
Main()調(diào)用:
#region Main 入口 /// <summary> /// 程序 /// </summary> class Program { /// <summary> /// 主入口 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Derived d = new Derived(); Console.WriteLine("-----------------------以上為無參構(gòu)造------------------------------------------"); Derived d1 = new Derived(1, 2); Console.WriteLine("-----------------------以上為2個(gè)參數(shù)構(gòu)造---------------------------------------"); Derived d2 = new Derived(1, "1"); Console.WriteLine("-----------------------以上為2個(gè)參數(shù)構(gòu)造,6個(gè)私變量----------------------------"); //先調(diào)用有參的構(gòu)造函數(shù)一旦被調(diào)用,無參的構(gòu)造函數(shù)都不會(huì)被調(diào)用了 //先執(zhí)行父類的構(gòu)造函數(shù),才執(zhí)行子類的 Console.ReadLine(); } } #endregion
三、輸出結(jié)果
會(huì)先調(diào)用這里:這是父類 這是派生類-無參-構(gòu)造函數(shù) -----------------------以上為無參構(gòu)造------------------------------------------ 會(huì)先調(diào)用這里:這是父類 這是y賦值完成 -----------------------以上為2個(gè)參數(shù)構(gòu)造--------------------------------------- 最長參數(shù)構(gòu)造運(yùn)行 1|1|1|1|1|1|1| 1第三方法 -----------------------以上為2個(gè)參數(shù)構(gòu)造,6個(gè)私變量----------------------------
到此這篇關(guān)于C#構(gòu)造函數(shù)在基類和父類中執(zhí)行順序的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#?PictureBox控件方法參數(shù)及圖片刪除重命名上傳詳解
這篇文章主要為大家介紹了C#?PictureBox控件方法參數(shù)及圖片刪除重命名上傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08C#畢業(yè)設(shè)計(jì)之Winform零壓健身房管理系統(tǒng)
本文介紹了個(gè)人的《零壓健身房管理系統(tǒng)(扁平化)》的基本流程和功能點(diǎn)的介紹,虛心接受各位的意見,歡迎在提出寶貴的意見,大家一起探討學(xué)習(xí)2021-09-09C#中的DataSet、string、DataTable、對(duì)象轉(zhuǎn)換成Json的實(shí)現(xiàn)代碼
這篇文章主要介紹了C#中的DataSet、string、DataTable、對(duì)象轉(zhuǎn)換成Json的實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-09-09DevExpress之SplashScreen用法實(shí)例
這篇文章主要介紹了DevExpress中SplashScreen的用法,對(duì)于C#初學(xué)者有很好的參考借鑒價(jià)值,需要的朋友可以參考下2014-08-08