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);
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0;x= 1 y = -1能不能详细的给我讲解下 是怎么走的 再线等 明白就给分

解决方案 »

  1.   

    当你new B()时,由于B是继承自A
    先会创建一个A的实例,这样就先创建A的构造,然后调用PrintFields(); 
    而PrintFields() 是一个virtual  方法,被B类重写,然后调用B的PrintFields();
    由于y 没初始化,所以先输出1,0
    这时开是调用B构造,给y一个-1,然后输出就是1,-1了
      

  2.   

    using System;
    class A
    {
    public static int X;
    static A(){
    X=B.Y+1;
    }
    }
    class B
    {
    public static int Y=A.X+1;
    static B(){}
    static void Main(){
    Console.WriteLine("X={0},Y={1}",A.X,B.Y);
    }
    }
    产生的输出结果是什么?
    答:x=1,y=2
    这个呢~
      

  3.   

    B的构造函数一开始先把X赋值为1 然后调用基类A的构造函数 由于A构造里调用的PrintFields()是虚拟函数 当前对象是B类的对象 所以调用了B的PrintFields()此时X是1 Y没有赋值 保持int类型的默认初始值0 所以输出1 0 PrintFields()函数调用完后 继续执行y=-1 此时X=1 Y=-1
      

  4.   

    第二个程序输出是x=2 y=1 
    先寻找A.X 在第一次访问静态成员之前要执行静态构造函数 此时调用A的构造函数 执行到X = B.Y + 1时 由于要访问B.Y 于是执行B的静态构造函数 此时读入A.X 由于X还没有赋值 所以保持默认初始值0 然后B.Y就等于0+1=1 接着返回到X = B.Y + 1这句 X就等于1+1=2 所以输出是2 1
      

  5.   

    也就是说访问A.X时 先调用A的静态构造函数 再次之前A.X已经是int的默认初始值0 在X=B.Y+1 这句执行完了以后X就变成2了
    而在X=B.Y+1这句正在执行访问B.Y的时候A.X还是0 所以B.Y变成1 然后执行X=B.Y+1 X变成2