本节主要介绍一个对象构造的过程,看下面的代码:
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 废话:静态成员变量只会构造一次,静态构造函数只会执行一次。
总结成一句话就是:先静态,后实例,先成员变量,后构造函数,实例构造函数激发类的递归构造。
