一道关于实例化顺序的C#面试题
转自http://kb.cnblogs.com/page/104476/
1 public class BaseA 2 { 3 public static MyTest a1 = new MyTest("a1"); 4 public MyTest a2 = new MyTest("a2"); 5 static BaseA() 6 { 7 MyTest a3 = new MyTest("a3"); 8 } 9 public BaseA() 10 { 11 MyTest a4 = new MyTest("a4"); 12 } 13 public virtual void MyFun() 14 { 15 MyTest a5 = new MyTest("a5"); 16 } 17 } 18 public class BaseB : BaseA 19 { 20 public static MyTest b1 = new MyTest("b1"); 21 public MyTest b2 = new MyTest("b2"); 22 static BaseB() 23 { 24 MyTest b3 = new MyTest("b3"); 25 } 26 public BaseB() 27 { 28 MyTest b4 = new MyTest("b4"); 29 } 30 public new void MyFun() 31 { 32 MyTest b5 = new MyTest("b5"); 33 } 34 } 35 static class Program 36 { 37 static void Main() 38 { 39 BaseB baseb = new BaseB(); 40 baseb.MyFun(); 41 } 42 } 43 public class MyTest 44 { 45 public MyTest(string info) 46 { 47 Console.WriteLine(info); 48 } 49 }
最后的问题是:请写出Main()方法中,a1-a5,b1-b5这十个类实例化的顺序。(MyTest类是我自己添的,方便查看结果,原题是是实例化一个object类。)
这个答对了。
C#里没有接触,倒是在JAVA里看过
类的加载及初始化
静态构造块(静态属性,主要功能是为类的对象共享),静态构造函数(静态构造函数只在类对象第一次创建实例时执行,多是为静态属性赋初值),构造块,构造函数
所以上面的答案是
1 b1 B类的 静态构造块
2 b3 B类的 静态构造方法
3 b2 B类的 构造块
4 a1 A类的 静态构造块,这里是执行B类的构造方法,我们知道,要先执行父类的初始化,再执行本类的构造方法,4-7是A类的初始化。
5 a3 A类的 静态构造方法
6 a2 A类的 构造块
7 a4 A类的 构造方法
8 b4 B类的 构造方法
9 b5 B类的 Myfun方法。
这里有个无关的小知识点。
public new void MyFun()
new 修饰符
在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员