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是怎么回事呢?难道是编译器默认的给重写过的方法里面不认识的字段自动初始化吗? 还有希望大侠们告诉小弟关于继承应该注意哪些东西,或者推荐些好的文章书籍之类的. 感激不尽!!!
2 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
你实例化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
- 2 回答
- 0 关注
- 431 浏览
添加回答
举报
0/150
提交
取消