using System; 
using System.Collections.Generic; 
using System.Text; namespace ConsoleApplication4 

    using System; 
    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 Test 
    { 
        static void Main() 
        { 
            B b = new B(); 
        } 
    
    }} 为什么最后的输出会是 X=1 Y=0  ,y为什么会是0

解决方案 »

  1.   

    类B中y没有初始化,所以分配了值0给y; 
     当B   b   =   new   B()时, 先调用父类A的构造函数,调用PrintFields(),由于PrintFields是virtual的,并在B中override,所以就调用B自己的PrintFields. 打印出x=0,y=1   
      
      

  2.   

      你的意思是说,这样子类的构造函数不执行了,是吧 ,
     public B() 
            { 
                y = -1; 
            } 
     这句代码不执行了,是吧 如果父类有明确的构造函数,那么子类的构造函数就不执行了,是吧
      

  3.   

     
    1、b继承a。因此在构造函数B()中先调用构造函数A()。
    2、构造函数A()中执行PrintFields()方法。这时候 x = 1;y未定义。但是C#在创建实例时,自动默认未初始化的字段(值类型为0,引用类型为null),则y为0,并输出到控制台。
    3、然后才执行y = -1; 
    你可以断点,然后按f11,一步步看是怎么执行的。