天天看點

構造函數

構造函數是一種特殊的函數,該函數沒有傳回值,且名稱必須和類的名稱一緻。更重要的是構造函數不可以被繼承。

當一個類沒有定義任何的構造函數時,編譯器會給這個類一個預設的構造函數。

預設的構造函數沒有參數,且是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有靜态構造函數,靜态構造函數優先,是以

運作的結果是

Static 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(); }

構造函數

}

構造函數

本文轉自shyleoking 51CTO部落格,原文連結:http://blog.51cto.com/shyleoking/806290

繼續閱讀