作者:郑凯丰
开发工具:VS
编写日期:2019年8月15日
实例构造函数的调用顺序刚好相反,所以创建子类实例时,其所有构造函数和变量的调用顺序为:
子类静态变量初始化>子类静态构造函数>父类静态变量初始化 > 父类静态构造函数 > 父类实例变量初始化>父类实例构造函数 > 子类实例变量初始化>本身实例构造函数
解答:构造函数是先执行静态(只执行一次);如果继承了会先执行子类;
构造函数(Parent)在(Child)new出来的那一刻起就已经开始执行了,然后他有子类继承所以:先执行子类(Child)里的静态方法(static Child()),再执行父类里的静态方法(static Parent()),然后再执行(Parent()),之后再执行(Child()),下一步因为Main里面实例化了子类(Child)调用了子类里面的(Add),Add里面的(base)可以直接指向继承的父类成员的公共类和受保护成员方法,之后再执行子类里面的(Add),下一步就执行子类里面的(GO)方法里面的(base.Go())直接调用了父类的(Go)方法,之后再执行子类的(GO)方法;
答案:
public class Parent
{
static Parent()
{
Console.WriteLine("Parent Static Constructor a");//A
}
public Parent()
{
Console.WriteLine("Parent Constructor b");//B
}
public virtual void Add()//虚方法
{
Console.WriteLine("Parent virtual Add c");//C
}
public virtual void Go(){
}
}
public class Child : Parent
{
static Child()
{
Console.WriteLine("Child Static Constructor d");//D
}
public Child()
{
Console.WriteLine("Child Constructor e");//E
}
public override void Add()
{
base.Add();
Console.WriteLine("Child override Add f");//F
}
public override void Go(){
base.Go();
Console.WriteLine("Child override Go j");//J
}
}
class Program
{
static void Main(string[] args)
{
Child child = new Child();
child.Add();
child.Go();
}
}
答案结果为:D、A、B、C、F、J