构造函数

构造函数是一种特殊的函数,该函数没有返回值,且名称必须和类的名称一致。更重要的是构造函数不可以被继承。
当一个类没有定义任何的构造函数时,编译器会给这个类一个默认的构造函数。
默认的构造函数没有参数,且是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构造函数 System.Threading.Thread.Sleep(500);
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都比当前构造函数优先。

请运行和分析一下下面的代码
1构造函数 public class Space
2构造函数 {
3构造函数
4构造函数 public static void Main(string[] args)
5构造函数 {
6构造函数 ShipOrder ShipOrder1 = new ShipOrder();
7构造函数 System.Console.WriteLine("----------------");
8构造函数 System.Threading.Thread.Sleep(500);
9构造函数 ShipOrder ShipOrder2 = new ShipOrder();
10构造函数 System.Console.WriteLine("----------------");
11构造函数 System.Threading.Thread.Sleep(500);
12构造函数 ShipOrder ShipOrder3 = new ShipOrder();
13构造函数 }

14构造函数
15构造函数 }

16构造函数
17构造函数 public class Order
18构造函数 {
19构造函数
20构造函数 static Order()
21构造函数 {
22构造函数 System.Console.WriteLine("Static Order()");
23构造函数 }

24构造函数 public Order()
25构造函数 {
26构造函数 System.Console.WriteLine("Order()");
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()
----------------
Order()
ShipOrder(string)
ShipOrder()
----------------
Order()
ShipOrder(string)
ShipOrder()


有意思的是我们修改一下代码
1构造函数 public class Space
2构造函数 {
3构造函数
4构造函数 public static void Main(string[] args)
5构造函数 {
6构造函数 ShipOrder ShipOrder1 = new ShipOrder();
7构造函数 System.Console.WriteLine("----------------");
8构造函数 System.Threading.Thread.Sleep(500);
9构造函数 ShipOrder ShipOrder2 = new ShipOrder();
10构造函数 System.Console.WriteLine("----------------");
11构造函数 System.Threading.Thread.Sleep(500);
12构造函数 ShipOrder ShipOrder3 = new ShipOrder();
13构造函数 }

14构造函数
15构造函数 }

16构造函数
17构造函数 public class Order
18构造函数 {
19构造函数
20构造函数 static Order()
21构造函数 {
22构造函数 System.Console.WriteLine("Static Order()");
23构造函数 }

24构造函数 public Order()
25构造函数 {
26构造函数 System.Console.WriteLine("Order()");
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构造函数 }

注意第36行,现在的运行结果是什么样的呢?
结果和刚才一样,因此我们证明,无论怎么样,在构造子类前,编译器会先构造基类。

ok,最后我们看一下,下面的运行结果你认为是什么呢?
1构造函数public class Hello
2构造函数{
3构造函数 private static int n=20;
4构造函数 public int m=10;
5构造函数 static Hello()
6构造函数 { System.Console.WriteLine(n); }
7构造函数 public Hello():this(15)
8构造函数 { System.Console.WriteLine(this.m);
9构造函数 System.Console.WriteLine(n);
10构造函数 System.Console.ReadLine(); }

11构造函数 public Hello(int i ):base()
12构造函数 { System.Console.WriteLine(i); }
13构造函数 public static void Main(string[] args)
14构造函数 new Hello(); }
15构造函数}

16构造函数

 


本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/806290

上一篇:magento 1.4 -- 后台权限里角色资源无法翻译的bug及解决方案


下一篇:EntityFramework 7 smallint short 奇怪问题(已解决)