//运行结果x=1,y=0
    class A
    {
        public A()
        {
            PrintFields();        }
        //virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。例如,此方法可被任何继承它的类重写。
        public virtual void PrintFields() { }
    }
    class B : A
    {
        int x = 1;
        int y;
        public B() { y = -1; }
        //要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
        public override void PrintFields()
        {
           
            Console.WriteLine("x={0},y={1}", x,y);
        }
        public static void Main()
        {
            Console.Write(new B());
        }
    }为什么public B() { y = -1; } 没有被执行???

解决方案 »

  1.   

    public B():base() { y = -1; } 
    public static void Main()
            {
                new B();
            } 
      

  2.   

    楼主对类变量以及构造函数的调用顺序可以多了解一下基本上是:
    子类的变量:int x = 1;
    子类的构造函数:B(),这里会去先执行基类的构造函数也就是A(){...}然后再执行自己的函数体{y=-1}
      

  3.   

    执行了,你这样试试:
     Console.Write(new B().y);
    y已经变成-1了,关键在于父类的构造函数先于子类执行
      

  4.   

    敢情楼主听不懂中文?
    不是给你说得非常清楚了吗:父类的构造函数先于子类执行
    也就是:
    A()
    PrintFields()
    B()执行PrintFields的时候,B的构造函数还没执行呢,所以是0,而最终Console.Write(new B().y),这里就是-1了楼主应该是来自阿富汗吧,建议先学习中文,明白什么叫父类的构造函数于子类执行
      

  5.   

    CsToD讲得挺仔细了,
    先执行父类构造方法,再执行子类构造方法
    你的方法刚执行到父类构造方法就把x,y输出了:Console.WriteLine("x={0},y={1}", x,y); 
    输出完后才执行你子类的 y = -1;语句