首页 新闻 会员 周边 捐助

一道关于类的继承的面试题

0
悬赏园豆:30 [已解决问题] 解决于 2011-10-15 11:09
    class A {
public A() {
Print();
}
public virtual void Print() { }
}
class B : A {
int x = 1;
int y;
public B() {
y = 2;
}
public override void Print() {
Console.WriteLine("x=" + x + " y=" + y);
}
}

  这道面试题如上,问题是当实例化B的时候会输出什么?

  我对继承懂的还不是很清楚,忘高手帮忙排忧解惑下:

  我知道在B实例化的时候首先调用基类A的构造方法,而A的构造方法被B类重写过了,但是在重写的方法里面调用了2个B类的字段x和y,x=1是肯定没问题的,因为x已经被初始化了,但是y没有被初始化,所有y应该是null吧,因为在A类调用构造方法Print()函数的时候B类的构造函数还没有执行,我面试的时候就想这个应该会抛出异常吧,但是我后来测试下发现结果是x=1,y=0

  不知道这个y=0是怎么回事呢?难道是编译器默认的给重写过的方法里面不认识的字段自动初始化吗?

  还有希望大侠们告诉小弟关于继承应该注意哪些东西,或者推荐些好的文章书籍之类的.

  感激不尽!!!

啊風的主页 啊風 | 初学一级 | 园豆:112
提问于:2011-10-13 23:13
< >
分享
最佳答案
0

“x=1是肯定没问题的,因为x已经被初始化了,但是y没有被初始化,所有y应该是null吧”,y是值类型,默认是0,引用类型默认才是null

收获园豆:30
LCM | 大侠五级 |园豆:6876 | 2011-10-14 09:26

正解,值类型默认值为0

webaspx | 园豆:1973 (小虾三级) | 2011-10-14 12:57

@webaspx: 

值类型和引用类型。。。

我知道了,忘了这茬了。。

谢谢提醒~!

啊風 | 园豆:112 (初学一级) | 2011-10-15 11:09
其他回答(4)
1

你实例化B的输出结果是 X=1,Y=0,这都是你重写Print()的结果

那么这是为什么呢?

1,首先B是继承A的,实例化B回先执行继承A类的方法, A类里有一个虚方法是空的,它什么事情都没有干,它还写了一个构造函数调用这个虚方法。

2,在B类里面用override 重写了A类里的虚方法,最上面x,y都已经初始化, 且都是值类型的,他们的默认值都是0,

3,所以实例化B调用的事重写后的方法Print() ,当实例化B之后,虽然最终的Y的结果是2 ,但是Print()不回调用

 

如果是问y的结果是多少,你回答2就对了  但在这里它的结果是等于0

等待是一生最初的苍老 | 园豆:3 (初学一级) | 2011-10-14 11:58

回答有点问题   是说它x输出为0  不是所它的最终结果为0

0
wxifly | 园豆:167 (初学一级) | 2011-10-14 12:36
1

y是int型,默认初始化是0,不是null。实例化B类的时候是先执行父类A的构造函数,而A类的构造函数里是print函数,print被B类重写,于是就从A类的构造函数执行到B类的print函数,这时候还没有机会执行B类的构造函数,于是y就输出默认值0。你可以打断点自己试试程序流向。

 

介绍你看《你必须知道的.net》

姚一^o^ | 园豆:410 (菜鸟二级) | 2011-10-14 16:25
0

。。。。

你在B 建立对象,只会调用B类的 print()方法,

程序运行第一步,先初始化 x=1,然后到 B的构造函数,因为默认是调用父类的构造函数的,所以在A的构函数调用print方法,这个时候 print方法因为被B重写了,执行B中的print方法,此时:

x=1,Y=0,因为默认的,

 

然后执行完毕之后,这个时候才是A的构造函数结束了,然后 转到初始化 B的构造函数,然后Y才会等于2.

 

所以在Y被初始化前,已经console输出了,所以答案是X=1,Y=0

Anleb | 园豆:208 (菜鸟二级) | 2011-12-22 12:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册