日期:2014-05-18  浏览次数:20889 次

一道C#基础题,我看不懂
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 
为什么会输出这样的结果呢,哪位仁兄能帮我解释一下啊,谢过了。

------解决方案--------------------
先要执行默认构造函数
------解决方案--------------------
new B 的时候先构造基类A 此时的x,y 是他们的初始值
所以先输出 x = 1 y = 0
然后再构造B 给y附值 但是不会再输入结果 除非在B构造函数中再调用PrintFields(); 或者在 B b = new B(); b.PrintFields();

所以 最终结果是 x=1,y=0
------解决方案--------------------
探讨
先要执行默认构造函数

------解决方案--------------------
new B()是先执行A类中的构造,再执行B类的构造,因为A类中的PrintFields()方法是虚方法,所以A类构造执行的是被B类所替换的PrintFields()方法,得到x=1,y=0
------解决方案--------------------
我问一句,怎么没有看到大写的X、Y两个变量呢?
------解决方案--------------------
的确是基础问题
------解决方案--------------------
这个好像是.net 面试题目里的,注意到PrintFields方法执行了两次就行了
x=1,y=0
x=1,y=-1 

------解决方案--------------------

------解决方案--------------------
楼主给的答案不对,
应该只有x=1,y=0;
调用子类的构造函数形成子类实例前会调用父类的构造方法先形成父类实例。
你把代码放到IDE环境中点“逐过程”执行就可以看到顺序了
------解决方案--------------------
楼主的代码会输出两次吗?应该是只有一行输出:
x=1,y=0;

一个实例对象的初始化整个执行的优先级是这样的:
1、执行类的静态初始化,即x=1和隐式执行的y=0;
2、执行基类的构造函数,从继承树最上端的类开始初始化,即:最首先执行的是Object类的构造函数,然后依次进行;
3、执行当前类的构造函数。

从你的这个函数上来说,它的流程无非是这样的。

1、执行了x=1,y=0;
2、执行了A中的构造函数,即PrintField(),输出x=1,y=0;
3、执行B中的构造函数,无函数体,无输出。