构造函数,静态构造函数执行顺序

1、前言

面试过程中经常被问到构造函数的执行顺序,平时很少用到,一问就蒙圈。闲暇之时花了点时间把这一块做了个总结。

2、正文

直接上代码

 1         public class A
 2         {
 3             static A()
 4             {
 5                 Console.WriteLine("SA");
 6             }
 7             public A()
 8             {
 9                 Console.WriteLine("baseA");
10             }
11             public virtual void Fun()
12             {
13                 Console.WriteLine("A.Fun");
14             }
15         }
16         public class B : A
17         {
18             static B()
19             {
20                 Console.WriteLine("SB");
21             }
22             public B()
23             {
24                 Console.WriteLine("baseB");
25             }
26             public override void Fun()
27             {
28                 Console.WriteLine("B.Fun");
29             }
30         }
A a = new A();
a.Fun(); 

输出:SA baseA A.Fun

A b=new B();
b.Fun();

输出:SB SA baseA baseB B.Fun

好了,同学,我知道你看到这里的时候也是蒙圈的,莫慌,收下在下的十二字口诀“先静后构,静外到内,构内到外”。

先静后构:

一个类同时存在静态构造函数和普通构造函数,对象实例化后,先执行静态构造函数(先静),再执行普通构造函数(后构);

故上文对象A实例后输出的是SA baseA。

静外到内:

父类和子类都存在静态构造函数的时候,实例化子类后,先执行子类静态构造函数(静外),再执行父类静态构造函数(到内);

上文B继承了A,B和A同时存在静态构造函数,实例化B后,静态构造函数输出结果是是SB SA

构内到外:

实例化子类后,先执行父类的普通构造函数(构内),再执行子类的构造函数(到外)。

上文B继承了A,实例化B后,普通构造函数输出结果是baseA baseB

 

怎么样,看到这里理解了那十二字口诀了吗?

 

 

 

 

 

posted @ 2020-09-02 15:52  奔跑的楚奕  阅读(657)  评论(0)    收藏  举报