華文網

攜程的一道筆試題,據說60%人都做錯了

2015年攜程的Java工程師一道筆試題!

Base類

大家猜猜這個會輸出什麼呢?靜態內部類繼承Base類,

屬性和父類的一樣,重寫了父類的一個方法,然後在main函數裡面調子類的構造函數,其實仔細思考一下大概就知道輸出的是什麼了~

輸出的答案是null

這題的流程是在初始化 Sub 物件前,首先 JAVA 虛擬機器就在堆區開闢記憶體並將子類 Sub 中的 baseName 和父類 Base 中的 baseName均賦為 null。Base b = new Sub()的時候 ,會先調用父類的無參構造函數,因為子類和父類屬性名一樣的話,會將父類的屬性隱藏。

調用了父類的構造函數,父類的構造函數中調用了 callName 方法,此時父類中的 baseName 的值為 base,可是子類重寫了 callName 方法,且 調用父類 Base 中的 callName 是在子類 Sub 中調用的,因此當前的 this 指向的是子類,也就是說是實現子類的 callName 方法。可見,在 baseName = “sub” 執行前(子類設定陳述式),子類的 callName() 已經執行,所以子類的 baseName 為預設值狀態 null 。

比較忙題目的就先發這個把。

謝謝大家的收看,喜歡的關注一波。