构造函数

构造函数是一种特殊的函数,该函数没有返回值,且名称必须和类的名称一致。更重要的是构造函数不可以被继承。
当一个类没有定义任何的构造函数时,编译器会给这个类一个默认的构造函数。
默认的构造函数没有参数,且是public访问修饰。

构造函数是类最先调用的函数。又被分为实例构造函数和静态构造函数。

静态构造函数(也叫类型构造函数):一个类只能有一个静态构造函数。该构造函数没有访问修饰,没有参数。
静态构造函数在整个运行中,只被访问一次,那是在对该类第一次实例化或第一次调用该类的静态成员是访问静态构造函数。
所以说静态构造函数比实例构造函数(如果存在实例构造函数)调用得更早。

实例构造函数可以有多种访问修饰,可以有参数(也就是说可以有多个实例构造函数),实例构造函数是当用户实例化类的时候,也就是在用new构造类的时候调用。

1None.gifpublicclassSpace
2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
3InBlock.gif
4InBlock.gifpublicstaticvoidMain(string[]args)
5ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
6InBlock.gifOrderorder1=newOrder();
7InBlock.gifSystem.Threading.Thread.Sleep(500);
8InBlock.gifOrderorder2=newOrder();
9InBlock.gifSystem.Threading.Thread.Sleep(500);
10InBlock.gifOrderorder3=newOrder();
11ExpandedSubBlockEnd.gif}

12InBlock.gif
13ExpandedBlockEnd.gif}

14None.gif
15None.gifpublicclassOrder
16ExpandedBlockStart.gifContractedBlock.gifdot.gif{
17InBlock.gif
18InBlock.gifstaticOrder()
19ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
20InBlock.gifSystem.Console.WriteLine("StaticOrder()");
21ExpandedSubBlockEnd.gif}

22InBlock.gifpublicOrder()
23ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
24InBlock.gifSystem.Console.WriteLine("Order()");
25ExpandedSubBlockEnd.gif}

26ExpandedBlockEnd.gif}


运行上面的代码,你可以发现,System.Console.WriteLine("Static Order()");只被调用了一次。而System.Console.WriteLine("Order()");在每次new的时候都被调用。

构造函数虽然不能被继承,也不能在非New的时候被调用,但是构造函数却可以调用基类的构造函数和当前类的其他构造函数(当然是指实例构造函数了,因为静态构造函数当前类只有一个,静态构造函数也不能访问基类的构造函数)
基类的构造函数通过base关键字访问。当前实例的其他构造函数通过this访问。且base和this都比当前构造函数优先。

请运行和分析一下下面的代码
1None.gifpublicclassSpace
2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
3InBlock.gif
4InBlock.gifpublicstaticvoidMain(string[]args)
5ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
6InBlock.gifShipOrderShipOrder1=newShipOrder();
7InBlock.gifSystem.Console.WriteLine("----------------");
8InBlock.gifSystem.Threading.Thread.Sleep(500);
9InBlock.gifShipOrderShipOrder2=newShipOrder();
10InBlock.gifSystem.Console.WriteLine("----------------");
11InBlock.gifSystem.Threading.Thread.Sleep(500);
12InBlock.gifShipOrderShipOrder3=newShipOrder();
13ExpandedSubBlockEnd.gif}

14InBlock.gif
15ExpandedBlockEnd.gif}

16None.gif
17None.gifpublicclassOrder
18ExpandedBlockStart.gifContractedBlock.gifdot.gif{
19InBlock.gif
20InBlock.gifstaticOrder()
21ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
22InBlock.gifSystem.Console.WriteLine("StaticOrder()");
23ExpandedSubBlockEnd.gif}

24InBlock.gifpublicOrder()
25ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
26InBlock.gifSystem.Console.WriteLine("Order()");
27ExpandedSubBlockEnd.gif}

28InBlock.gif
29InBlock.gifpublicstringNumber;
30ExpandedBlockEnd.gif}

31None.gif
32None.gifpublicclassShipOrder:Order
33ExpandedBlockStart.gifContractedBlock.gifdot.gif{
34InBlock.gif
35InBlock.gifpublicShipOrder(stringnumber)
36InBlock.gif:base()
37ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
38InBlock.gifSystem.Console.WriteLine("ShipOrder(string)");
39ExpandedSubBlockEnd.gif}

40InBlock.gif
41InBlock.gifpublicShipOrder()
42InBlock.gif:this("12-123")
43ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
44InBlock.gifSystem.Console.WriteLine("ShipOrder()");
45ExpandedSubBlockEnd.gif}

46InBlock.gif
47InBlock.gif
48ExpandedBlockEnd.gif}
我们实例化ShipOrder(无参构造函数)时,该构造函数要求先调用一个含string的有参构造函数(第42行)。而有参构造函数却要先调用基类Order的构造函数(第36行)。而基类Order有静态构造函数,静态构造函数优先,所以

运行的结果是
Static Order()
Order()
ShipOrder(string)
ShipOrder()
----------------
Order()
ShipOrder(string)
ShipOrder()
----------------
Order()
ShipOrder(string)
ShipOrder()


有意思的是我们修改一下代码
1None.gifpublicclassSpace
2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
3InBlock.gif
4InBlock.gifpublicstaticvoidMain(string[]args)
5ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
6InBlock.gifShipOrderShipOrder1=newShipOrder();
7InBlock.gifSystem.Console.WriteLine("----------------");
8InBlock.gifSystem.Threading.Thread.Sleep(500);
9InBlock.gifShipOrderShipOrder2=newShipOrder();
10InBlock.gifSystem.Console.WriteLine("----------------");
11InBlock.gifSystem.Threading.Thread.Sleep(500);
12InBlock.gifShipOrderShipOrder3=newShipOrder();
13ExpandedSubBlockEnd.gif}
14InBlock.gif
15ExpandedBlockEnd.gif}
16None.gif
17None.gifpublicclassOrder
18ExpandedBlockStart.gifContractedBlock.gifdot.gif{
19InBlock.gif
20InBlock.gifstaticOrder()
21ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
22InBlock.gifSystem.Console.WriteLine("StaticOrder()");
23ExpandedSubBlockEnd.gif}
24InBlock.gifpublicOrder()
25ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
26InBlock.gifSystem.Console.WriteLine("Order()");
27ExpandedSubBlockEnd.gif}
28InBlock.gif
29InBlock.gifpublicstringNumber;
30ExpandedBlockEnd.gif}
31None.gif
32None.gifpublicclassShipOrder:Order
33ExpandedBlockStart.gifContractedBlock.gifdot.gif{
34InBlock.gif
35InBlock.gifpublicShipOrder(stringnumber)
36InBlock.gif//:base()
37ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
38InBlock.gifSystem.Console.WriteLine("ShipOrder(string)");
39ExpandedSubBlockEnd.gif}

40InBlock.gif
41InBlock.gifpublicShipOrder()
42InBlock.gif:this("12-123")
43ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
44InBlock.gifSystem.Console.WriteLine("ShipOrder()");
45ExpandedSubBlockEnd.gif}

46InBlock.gif
47ExpandedBlockEnd.gif}

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

ok,最后我们看一下,下面的运行结果你认为是什么呢?
1None.gifpublicclassHello
2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
3InBlock.gifprivatestaticintn=20;
4InBlock.gifpublicintm=10;
5InBlock.gifstaticHello()
6ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{System.Console.WriteLine(n);}
7InBlock.gifpublicHello():this(15)
8ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{System.Console.WriteLine(this.m);
9InBlock.gifSystem.Console.WriteLine(n);
10ExpandedSubBlockEnd.gifSystem.Console.ReadLine();}

11InBlock.gifpublicHello(inti):base()
12ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{System.Console.WriteLine(i);}
13InBlock.gifpublicstaticvoidMain(string[]args)
14ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{newHello();}
15ExpandedBlockEnd.gif}

16None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值