看不明白为什么会输出这个结果!?
小弟刚接触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
------解决方案--------------------