小弟刚接触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 呢?

解决方案 »

  1.   

    后来又看了一下!不知道是不是该这么来理解B 继承 A
    在调用B的构造函数时 先调用A的构造函数 所以调用了 PrintFields又由于 在A类里 没有对y 进行初始化 所以y=0
      

  2.   

    感觉是先初始化成员变量(因为B继承于A, 所以先A的成员变量再B的成员变量), x = 1, y = 0;
    再调用构造函数(因为B继承于A, 所以A的构造函数,再B的构造函数)
      

  3.   

    实际上B调用了A的构造函数,执行PrintFields(),这时由于没有执行B的构造函数,所以y=0,输出的是x=1,y=0,但调用A的构造函数结束后,就会调用B的构造函数,这时y=-1,也就是说程序结束时,x=1,y=-1
      

  4.   

    没错的,程序先是调用A的构造函数,此时由于x在B类中是一个字段, 已经付值为1,所以x=1,但此时输出时,由于y还没有付值给它,所以它的值为0即y=0
      

  5.   

    当类B在Main方法中实例化的时候,由于B继承A,先调用A的构造函数, 运行到PrintFields();的时候,由于B重载了此方法public override void PrintFields(),所以运行B的方法,输出x=1,y=0
      

  6.   

    B继承了A 调用B的构造函数的时候会先执行A的构造函数,A的构造函数调用了PrintFieldsA public virtual void PrintFields() { } 是个虚函数 ,所以会先输出 x=1 y=0
    然后将y=-1
      

  7.   

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

  8.   

    实例化B时,首先会实例化A,因为A是B的父类,是基础;而实例化A的过程中,A的构造函数内有打印方法,因为A的打印方法是虚函数,所以会自动调用具体实例化类B内所重写的该打印方法,但是这时B的构造函数还没有执行,所以y没有被赋予1,所以输出了x=1,y=0另:真是这个输出吗?我觉得应该抛出y未初始化的异常的。
      

  9.   

    B继承了A,调用B的构造函数的时候会先执行A的构造函数!很清楚的。
      

  10.   

    to zhufanxz() ( ) 信誉:100 变量在 过程中未初始化 会抛出 异常但在类中不会
      

  11.   

    变量在 过程中未初始化 会抛出 异常
    未初始化是编译错误调用null的方法或者使用其成员会导致未将对象引用设置到对象实例的异常。
      

  12.   

    实例化过程是先实例化过程是首先实例化B的字段x,y,然后在执行B的实例化函数之前,因为从A类继承,所以要实例化基类A,再执行B的实例化函数;A类的实例化函数调了虚方法,这个方法由B类实现,所以实际被调用的函数是B类中的方法,在执行该方法时,B类的实例化函数尚未执行,x,y的值为原始值,所以最终结果为x=1,y=0
    可以大多数人对实例化过程有点误解,认为执行实例化函数才是开始实例化一个类,其实这应该是错误的.完整的实例化过程应该是:实例化子类字段>>实例化基类字段>>执行基类实例化函数>>执行子类实例化函数>>完成实例化。通过逐语句跟踪的方式可以清楚的查看类实例化的过程。