【漫畫】騰訊面試,我竟然輸給了final關鍵字

作者:喬戈裡 
公眾號:程序員喬戈裡


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


騰訊面試現場

【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


——————

【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


final 在 Java 中是一個保留的關鍵字,可以聲明變量、方法、類。

什麼是final變量 / 類 / 方法?

任何變量前被 final 修飾就是 final 變量,定義的類前被 final 修飾就是 final 類,任何方法前被 final 修飾就是final方法。


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


當用 final 修飾一個類時,表明這個類不能被繼承。你看看到圖中箭頭指向的地方,那句英文翻譯過來就是不能繼承 Cat 類。

如果把 final 關鍵字去掉,就可以了。你看這樣就不會報錯了!


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


下面這段話摘自《Java編程思想》第四版第143頁:

“使用 final 方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的 Java 版本中,不需要使用 final 方法進行這些優化了。“


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


變量被 final 修飾就是就是 final 變量,那麼問題來了,final 變量和普通變量到底有啥區別?


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


  • 變量a指的是字符串常量池中的 xiaomeng2;
  • 變量 b 是 final 修飾的,變量 b 的值在編譯時候就已經確定了它的確定值,換句話說就是提前知道了變量 b 的內容到底是個啥,相當於一個編譯期常量;
  • 變量 c 是 b + 2得到的,由於 b 是一個常量,所以在使用 b 的時候直接相當於使用 b 的原始值(xiaomeng)來進行計算,所以 c 生成的也是一個常量,a 是常量,c 也是常量,都是 xiaomeng2 而 Java 中常量池中只生成唯一的一個 xiaomeng2 字符串,所以 a 和 c 是相等的!
  • d 是指向常量池中 xiaomeng,但由於 d 不是 final 修飾,也就是說在使用 d 的時候不會提前知道 d 的值是什麼,所以在計算 e 的時候就不一樣了,e的話由於使用的是 d 的引用計算,變量d的訪問卻需要在運行時通過鏈接來進行,所以這種計算會在堆上生成 xiaomeng2 ,所以最終 e 指向的是堆上的 xiaomeng2 , 所以 a 和 e 不相等。


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


【漫畫】騰訊面試,我竟然輸給了final關鍵字


  • final方法比非final快一些
  • final關鍵字提高了性能。JVM和Java應用都會緩存final變量。
  • final變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。
  • 使用final關鍵字,JVM會對方法、變量及類進行優化。


【漫畫】騰訊面試,我竟然輸給了final關鍵字


表情包出自:微博@不覺曉曉
PS:本故事純屬虛構

34張架構史上最全技術知識圖譜

相關推薦

推薦中...