namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // DriveB d = new DriveB(); DriveC f = new DriveC(); } } class BaseA { static DisplayClass a = new DisplayClass("基类静态成员初始化"); DisplayClass BaseA_c = new DisplayClass("基类实例变量BaseA_c初始化"); public BaseA() { Console.WriteLine("基类构造方法被调用A"); } } class DriveB : BaseA { static DisplayClass DriveB_b = new DisplayClass("继承类静态成员DriveB_b初始化"); //static BaseA DriveB_a = new BaseA(); DisplayClass DriveB_c = new DisplayClass("继承类实例变量DriveB_c初始化"); public DriveB() { Console.WriteLine("继承类构造方法被调用B"); } } class DriveC : DriveB { static DisplayClass DriveC_d = new DisplayClass("继承类静态成员DriveC_d初始化"); DisplayClass DriveC_e = new DisplayClass("继承类静态成员DriveC_e初始化"); public DriveC() { Console.WriteLine("继承类构造方法被调用C"); } } class DisplayClass { public DisplayClass(string diplayString) { Console.WriteLine(diplayString); Console.WriteLine(); } } }
输出结果为:
继承类静态成员DriveC_d初始化
继承类静态成员DriveC_e初始化
继承类静态成员DriveB_b初始化
继承类实例变量DriveB_c初始化
基类静态成员初始化
基类实例变量BaseA_c初始化
基类构造方法被调用A 继承类构造方法被调用B 继承类构造方法被调用C 请按任意键继续. . .
由此可见c#中类成员的初始化与java不同,总结下有四条规律
1。类成员变量初始化先于类的构造函数
2。静态成员变量先于实例变量
3。子类成员变量先于父类成员变量
4。父类构造函数先于子类构造函数
class A { public static int X; static A() { X = B.Y + 1; } } class B { public static int Y = A.X + 1; static B() { Y = A.X + 1; } static void Main() { Console.WriteLine("X={0},Y={1}", A.X, B.Y); } }