天天看点

构造函数

构造函数是一种特殊的函数,该函数没有返回值,且名称必须和类的名称一致。更重要的是构造函数不可以被继承。

当一个类没有定义任何的构造函数时,编译器会给这个类一个默认的构造函数。

默认的构造函数没有参数,且是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

继续阅读