說明
本文轉(zhuǎn)載自:C#中基類和派生類的構(gòu)造函數(shù)以及變量的執(zhí)行順序整理
為方便統(tǒng)一管理自己學(xué)習(xí)知識(shí)體系漂羊,所以將博文載入扼雏。
源碼
class Program
{
static void Main(string[] args)
{
B b = new B();
Console.WriteLine(A.s_a);
Console.WriteLine(B.s_b);
Console.WriteLine(b.g_a);
Console.WriteLine(b.g_a_1);
Console.WriteLine(b.g_b);
Console.ReadKey();
}
}
//基類
class A
{
//靜態(tài)變量
public static string s_a = "A.s_a" + (C.index++).ToString("_00");
//變量
public string g_a = "A.g_a" + (C.index).ToString("_00");
//為了顯示A.g_a
public string g_a_1 = "A.g_a_1" + (C.index++).ToString("_00");
//靜態(tài)構(gòu)造函數(shù)
static A()
{
Console.WriteLine("It is in static A()" + (C.index++).ToString("_00"));
}
//構(gòu)造函數(shù)
public A()
{
Console.WriteLine("It is in A()" + (C.index++).ToString("_00"));
this.M();
}
//虛方法
public virtual void M()
{
Console.WriteLine("It is in A.M()" + (C.index++).ToString("_00"));
}
}
//派生類
class B : A
{
//靜態(tài)變量
public static string s_b = "B.s_b" + (C.index++).ToString("_00");
//變量
public string g_b = "B.g_b" + (C.index++).ToString("_00");
//靜態(tài)構(gòu)造函數(shù)
static B()
{
Console.WriteLine("It is in static B()" + (C.index++).ToString("_00"));
}
//構(gòu)造函數(shù)
public B()
: base()
{
Console.WriteLine("It is in B()" + (C.index++).ToString("_00"));
g_a += "->B.g_a" + (C.index++).ToString("_00");
this.M();
}
//重寫方法
public override void M()
{
Console.WriteLine("It is in B.M()" + (C.index++).ToString("_00"));
Console.WriteLine("B.g_a=" + g_a + (C.index++).ToString("_00"));
}
}
class C
{
public static int index = 1;
}
代碼執(zhí)行結(jié)果
It is in static B()_02
It is in static A()_05
It is in A()_07
It is in B.M()_08
B.g_a=A.g_a_06_09
It is in B()_10
It is in B.M()_12
B.g_a=A.g_a_06->B.g_a_11_13
A.s_a_04
B.s_b_01
A.g_a_06->B.g_a_11
A.g_a_1_06
B.g_b_03
對(duì)執(zhí)行結(jié)果重新排序
B.s_b_01
It is in static B()_02
B.g_b_03
A.s_a_04
It is in static A()_05
A.g_a_1_06
It is in A()_07
It is in B.M()_08
B.g_a=A.g_a_06_09
It is in B()_10
A.g_a_06->B.g_a_11
It is in B.M()_12
B.g_a=A.g_a_06->B.g_a_11_13
結(jié)論
當(dāng)實(shí)例化一個(gè)子類時(shí)跌前,父類以及子類的變量初始化和構(gòu)造函數(shù)的執(zhí)行順序如下:
1._01子類的靜態(tài)變量前计;
2._02子類的靜態(tài)構(gòu)造函數(shù);
3._03子類的變量刚盈;
4._04父類的靜態(tài)變量(此時(shí)因?yàn)橐獔?zhí)行子類的構(gòu)造函數(shù)汽久,會(huì)與父類發(fā)生關(guān)系)鹤竭;
5._05父類靜態(tài)構(gòu)造函數(shù);
6._06父類變量景醇;
7._07父類構(gòu)造函數(shù)诺擅;
8._10子類構(gòu)造函數(shù)。
在試驗(yàn)過程里面添加了幾個(gè)步驟主要說明子類重寫父類方法的調(diào)用情況:
1.在父類的構(gòu)造函數(shù)中調(diào)用(步驟08)啡直,此時(shí)調(diào)用子類的實(shí)現(xiàn)時(shí)烁涌,其中的變量g_a的值還是來自于父類(步驟09);
2.在調(diào)用子類的構(gòu)造函數(shù)后酒觅,變量g_a的值被重新設(shè)置(步驟11)撮执,此時(shí)調(diào)用子類的實(shí)現(xiàn)時(shí),變量值是子類構(gòu)造函數(shù)中設(shè)定的舷丹。