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 關注
- 460 瀏覽
添加回答
舉報
0/150
提交
取消