首頁 > 軟體

直擊騰訊java高頻面試題,3月跳槽讓你怒斬騰訊offer

2021-03-19 19:31:34

我是一個喜歡總結經驗的人,每經過一場面試,我在回來的路上都會仔細回想今天哪些問題可以答得更好,或者哪些問題是自己之前沒遇到過的,或者是哪個知識點今天又問了等等。今天給大家分享一個我前天面試遇到的一個題目。

面試題目:

問題:

Test.main()函數執行後的輸出是()A:6 7 7B:22 34 17C:22 74 74D:11 17 34

答案解析:

思考和解決這個題的核心在於對java多型的理解,個人的理解是,執行物件例項化過程中遵循多型特性,呼叫的方法都是將要例項化的子類中的重寫的方法,只有明確地使用了super關鍵字或者是子類沒有的方法時,才會去呼叫父類相同的同名方法。

執行流程圖:

1.首先new B()會呼叫該函數的無參數構造方法,此時發現B類的無參數的構造方法有super(5),會呼叫A類的有參數構造方法,因為B類是繼承A類的,接著會執行A類有參數構造方法裡面的setValue(5),重點來了,A類有setValue()方法,但是B類也有相同的setValue()方法,那麼我們知道,呼叫的方法都是將要例項化的子類中的重寫的方法,因為一開始的時候是new B(),所以這裡的setValue()方法肯定是呼叫了B類的。

2.執行到B類的setValue()方法,此時發現方法裡面又呼叫了setValue()方法,但是這個方法前面有super,那麼這個setValue()方法就是A類的,程式碼執行到這裡就變成了super.setValue(2 * 5),然後由於A類的setValue()方法執行完,所以value=10;

3.執行完super(5)後,程式碼來到了setValue(getValue()- 3),先執行getValue()方法,來到getValue()方法,首先value++後,value=10+1=11,此時執行到return語句

3.1 因為finally語句塊無論如何都會執行,除非直接退出程式,此時11這個返回值會先暫存起來,程式碼往finally語句塊執行,我們發現又是setValue()方法,這時出現this呼叫這個方法,那麼this的話,我們只需記住一句話,誰呼叫這個方法,誰就是this,顯而易見,這個getValue()方法是B類發出呼叫請求的,所以this肯定是指B,那麼這個setValue()就是B類的,然後又會執行第2點的流程,執行完後value=11 * 2 = 22,因為形參是value = 11,System.out.println(value),控制檯輸出22

3.2 finally語句塊執行完,這時候才真正地把11這個返回值返回,說白了,經過一系列操作之後,getValue()方法的返回值依然是11,此時B類的setValue(11 - 3),然後執行第2點的流程,value=8 * 2 = 16

4.然後到了new B().getValue()方法,由於B類沒有getValue()方法,此處會呼叫A類的getValue()方法,先是value++之後呢就變成,value = 16 + 1 = 17,接著又會執行3.1的流程,先把17這個返回值暫存起來,程式碼往finally語句塊執行,執行完後value=17 * 2 = 34,因為形參是value = 17,System.out.println(value),控制檯輸出34

5.最後是System.out.println(new B().getValue()),因為getValue()方法返回的是暫存的17,所以最後控制檯輸出17

結果驗證:

答案:B

都看到這裡了,不考慮點個贊再走嘛!


IT145.com E-mail:sddin#qq.com