日期:2014-05-19  浏览次数:20750 次

看不明白为什么会输出这个结果!?

小弟刚接触C#有段时间,有段代码看不明白,有劳各位大侠指点迷经

        class   A
        {
                public   A()
                {
                        PrintFields();
                }
                public   virtual   void   PrintFields()   {   }
        }
        class   B   :   A
        {
                int   x   =   1;
                int   y;
                public   B()
                {
                        y   =   -1;
                }
                public   override   void   PrintFields()
                {
                        Console.WriteLine( "x={0},y={1} ",   x,   y);
                }
        }

        class   Program
        {
                static   void   Main(string[]   args)
                {
                        B   TB   =   new   B();
                }

        }

-----------------
输入结果为   x=1,y=0
-----------
我有两点不明白
1.我没有调用PrintFields   ()   为什么它会有输出呢!?

2.为什么   y不是-1   呢?

------解决方案--------------------
实际上B调用了A的构造函数,执行PrintFields(),这时由于没有执行B的构造函数,所以y=0,输出的是x=1,y=0,但调用A的构造函数结束后,就会调用B的构造函数,这时y=-1,也就是说程序结束时,x=1,y=-1
------解决方案--------------------
是这样的,先调用基类的构造方法再调用子类的构造方法
------解决方案--------------------
你自己分析的有道理。是先调用了A的构造函数
------解决方案--------------------
没错的,程序先是调用A的构造函数,此时由于x在B类中是一个字段, 已经付值为1,所以x=1,但此时输出时,由于y还没有付值给它,所以它的值为0即y=0
------解决方案--------------------
当类B在Main方法中实例化的时候,由于B继承A,先调用A的构造函数, 运行到PrintFields();的时候,由于B重载了此方法public override void PrintFields(),所以运行B的方法,输出x=1,y=0
------解决方案--------------------
B继承了A 调用B的构造函数的时候会先执行A的构造函数,A的构造函数调用了PrintFields

A public virtual void PrintFields() { } 是个虚函数 ,所以会先输出 x=1 y=0
然后将y=-1

------解决方案--------------------
继承时B的构造函数相当于
public B():A()
也就是说在进入B的构造器前要先进A所以打印x=1,y=0(因为y默认是0)
在进行完以上操作后
再吧y赋值为-1
如果再加句
B TB = new B();
TB.PrintFields();
打印结果就是1,-1
------解决方案--------------------