構造函數是一種特殊的函數,該函數沒有傳回值,且名稱必須和類的名稱一緻。更重要的是構造函數不可以被繼承。
當一個類沒有定義任何的構造函數時,編譯器會給這個類一個預設的構造函數。
預設的構造函數沒有參數,且是public通路修飾。
構造函數是類最先調用的函數。又被分為執行個體構造函數和靜态構造函數。
靜态構造函數(也叫類型構造函數):一個類隻能有一個靜态構造函數。該構造函數沒有通路修飾,沒有參數。
靜态構造函數在整個運作中,隻被通路一次,那是在對該類第一次執行個體化或第一次調用該類的靜态成員是通路靜态構造函數。
是以說靜态構造函數比執行個體構造函數(如果存在執行個體構造函數)調用得更早。
執行個體構造函數可以有多種通路修飾,可以有參數(也就是說可以有多個執行個體構造函數),執行個體構造函數是當使用者執行個體化類的時候,也就是在用new構造類的時候調用。
1
public class space
2
{
3
4
public static void main(string[] args)
5
6
order order1 = new order();
7
system.threading.thread.sleep(500);
8
order order2 = new order();
9
10
order order3 = new order();
11
}
12
13
14
15
public class order
16
17
18
static order()
19
20
system.console.writeline("static order()");
21
22
public order()
23
24
system.console.writeline("order()");
25
26
運作上面的代碼,你可以發現,system.console.writeline("static order()");隻被調用了一次。而system.console.writeline("order()");在每次new的時候都被調用。
構造函數雖然不能被繼承,也不能在非new的時候被調用,但是構造函數卻可以調用基類的構造函數和目前類的其他構造函數(當然是指執行個體構造函數了,因為靜态構造函數目前類隻有一個,靜态構造函數也不能通路基類的構造函數)
基類的構造函數通過base關鍵字通路。目前執行個體的其他構造函數通過this通路。且base和this都比目前構造函數優先。
請運作和分析一下下面的代碼
shiporder shiporder1 = new shiporder();
system.console.writeline("----------------");
shiporder shiporder2 = new shiporder();
shiporder shiporder3 = new shiporder();
27
28
29
public string number;
30
31
32
public class shiporder : order
33
34
35
public shiporder(string number)
36
: base()
37
38
system.console.writeline("shiporder(string)");
39
40
41
public shiporder()
42
: this("12-123")
43
44
system.console.writeline("shiporder()");
45
46
47
48
我們執行個體化shiporder(無參構造函數)時,該構造函數要求先調用一個含string的有參構造函數(第42行)。而有參構造函數卻要先調用基類order的構造函數(第36行)。而基類order有靜态構造函數,靜态構造函數優先,是以
運作的結果是
order()
shiporder(string)
shiporder()
----------------
有意思的是我們修改一下代碼
//: base()
注意第36行,現在的運作結果是什麼樣的呢?
結果和剛才一樣,是以我們證明,無論怎麼樣,在構造子類前,編譯器會先構造基類。
ok,最後我們看一下,下面的運作結果你認為是什麼呢?
public class hello
private static int n=20;
public int m=10;
static hello()
{ system.console.writeline(n); }
public hello():this(15)
{ system.console.writeline(this.m);
system.console.writeline(n);
system.console.readline(); }
public hello(int i ):base()
{ system.console.writeline(i); }
{ new hello(); }