class A { public A() { PrintFields(); } public void PrintFields() { Console.WriteLine("123"); } } class B : A { int x = 1; int y; public B() { y = -1; } public new void PrintFields() { Console.WriteLine("x={0},y={1} ", x, y); } } public static void Main() { B d = new B(); d.PrintFields(); Console.ReadKey(); }
当使用new B()创建B的实例时,产生什么输出?
--------------------------------------------
=========================================
x =1 y =0
new B()后首先执行
int x=1;
int y;
再执行B的构造函数时会调用基类构造函数先 于是执行
public A()
{
PrintFields();
}
而A中的PrintFields方法是virtual方法且B中已经用override关键字实现了该方法
于是会执行子类B中的PrintFields方法 Console.WriteLine( "x={0},y={1} ",x,y);
//注意此时还没有执行到B的构造函数 所以 y值为0
而后才执行到B的构造函数//此时 x=1 y =-1;
virtual修饰的方法为虚方法,暗示其子类最好有自己的实现
override修饰的方法为重写方法,表示覆盖了基类原有方法的实现
virtual修饰的方法
文章转载自http://www.cnblogs.com/zhangzt/archive/2013/05/15/3080263.html