public class Dog
{
public static string b1 = BFunc1();
public string b2 = BFunc2();
static Dog()
{
Console.WriteLine("子类:静态代码块");
}
public Dog()
{
Console.WriteLine("子类:构造方法");
}
public static string BFunc1()
{
Console.WriteLine("子类:静态字段");
return string.Empty;
}
public static string BFunc2()
{
Console.WriteLine("子类:成员字段");
return string.Empty;
}
}
由上得出执行顺序:静态字段 → 静态代码块 → 成员字段 → 构造方法
public class Dog : Animal
{
public static string b1 = BFunc1();
public string b2 = BFunc2();
static Dog()
{
Console.WriteLine("子类:静态代码块");
}
public Dog()
{
Console.WriteLine("子类:构造方法");
}
public static string BFunc1()
{
Console.WriteLine("子类:静态字段");
return string.Empty;
}
public static string BFunc2()
{
Console.WriteLine("子类:成员字段");
return string.Empty;
}
}
public class Animal
{
public static string a1 = AFunc1();
public string a2 = AFunc2();
static Animal()
{
Console.WriteLine("父类:静态代码块");
}
public Animal()
{
Console.WriteLine("父类:构造方法");
}
public static string AFunc1()
{
Console.WriteLine("父类:静态字段");
return string.Empty;
}
public static string AFunc2()
{
Console.WriteLine("父类:成员字段");
return string.Empty;
}
}
可以看出和没有继承关系的类的执行顺序大体一致,有细微差别:
子类静态字段 → 子类静态代码块 → 子类成员字段 → 父类静态字段 → 父类静态代码块 → 父类成员字段 →
父类构造方法 → 子类构造方法
这里任然符合:静态字段 → 静态代码块 → 成员字段 → 构造方法的整体顺序,差别在于继承,构造函数初始化时会优先初始化父类的构造函数。



