本节主要介绍一个对象构造的过程,看下面的代码:
public abstract class A { private static int s = 10;//1.5 private int m = 5;//1.7 static A() //1.6 { Console.WriteLine("A"); } public A()//1.8 { Say(); } public abstract void Say(); } public class B : A { private static int mCount = 0;//1.1 private int x = 1;//1.3 private int y = 2;//1.4 static B()//1.2 { Console.WriteLine("B"); } public B()//1.9 { x = 1; y = 1; mCount++; } public override void Say() { Console.WriteLine("x={0},y={1},count={2}",x,y,mCount); } }
Main函数代码:
static void Main(string[] args) { B b1 = new B();//我在上面的代码中用1.*标出了该语句的构造顺序 B b2 = new B(); Console.Read(); }
运行结果如下:
总结:
1,对象构造的顺序遵循如下原则:
1.1 先从要new 的类的静态成员开始构造,静态成员中,先构造静态成员变量,再执行静态构造函数。
1.2 接着构造要new的类的实例成员变量。
1.3 接着调用要new的类的实例构造函数,注意:在执行该实例构造函数前,会先激发基类的构造过程,基类的构造过程又会从1.1开始。
基类构造完毕后才会执行该实例构造函数。
可以这样理解:执行实例构造函数时意味着要真正创建类的实例了,但是这时父类还没有构造了,焉能先构造子类?
所以就要暂停执行子类的实例构造函数,转而启动父类的构造过程。
1.4 废话:静态成员变量只会构造一次,静态构造函数只会执行一次。
总结成一句话就是:先静态,后实例,先成员变量,后构造函数,实例构造函数激发类的递归构造。