构造函数,静态构造函数执行顺序
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
怎么样,看到这里理解了那十二字口诀了吗?

浙公网安备 33010602011771号