您好,登錄后才能下訂單哦!
前言
Java程序員面試,基礎真的很重要。基礎這東西,各個公司都很看重,尤其是大公司,他們看中人的潛力,他們舍得花精力去培養,所以基礎是重中之重。之前很多人問我,項目經歷少怎么辦,那就去打牢基礎,當你的基礎好的發指的時候,你的其他東西都不重要了。
Java 語言有很多看起來很相似,但是用途卻完全不同的語言要素,這些內容往往容易成為面試官考察你知識掌握程度的切入點。
今天,我要問你的是一個經典的 Java 基礎題目,談談 final、finally、 finalize 有什么不同?
典型回答
final 可以用來修飾類、方法、變量,分別有不同的意義,final 修飾的 class 代表不可以繼承擴展,final 的變量是不可以修改的,而 final 的方法也是不可以重寫的(override)。
finally 則是 Java 保證重點代碼一定要被執行的一種機制。我們可以使用 try-finally 或者 try-catch-finally 來進行類似關閉 JDBC 連接、保證 unlock 鎖等動作。
finalize 是基礎類 java.lang.Object 的一個方法,它的設計目的是保證對象在被垃圾收集前完成特定資源的回收。finalize 機制現在已經不推薦使用,并且在 JDK 9 開始被標記為 deprecated。
考點分析
這是一個非常經典的 Java 基礎問題,我上面的回答主要是從語法和使用實踐角度出發的,其實還有很多方面可以深入探討,面試官還可以考察你對性能、并發、對象生命周期或垃圾收集基本過程等方面的理解。
對于final
推薦使用 final 關鍵字來明確表示我們代碼的語義、邏輯意圖,這已經被證明在很多場景下是非常好的實踐,比如:
我們可以將方法或者類聲明為 final,這樣就可以明確告知別人,這些行為是不許修改的。
如果你關注過 Java 核心類庫的定義或源碼, 有沒有發現 java.lang 包下面的很多類,相當一部分都被聲明成為 final class?在第三方類庫的一些基礎類中同樣如此,這可以有效避免 API 使用者更改基礎功能,某種程度上,這是保證平臺安全的必要手段。
使用 final 修飾參數或者變量,也可以清楚地避免意外賦值導致的編程錯誤,甚至,有人明確推薦將所有方法參數、本地變量、成員變量聲明成 final。
final 變量產生了某種程度的不可變(immutable)的效果,所以,可以用于保護只讀數據,尤其是在并發編程中,因為明確地不能再賦值 final 變量,有利于減少額外的同步開銷,也可以省去一些防御性拷貝的必要。
final 也許會有性能的好處,很多文章或者書籍中都介紹了可在特定場景提高性能,比如,利用 final 可能有助于 JVM 將方法進行內聯,可以改善編譯器進行條件編譯的能力等等。
坦白說,很多類似的結論都是基于假設得出的,比如現代高性能 JVM(如 HotSpot)判斷內聯未必依賴 final 的提示,要相信 JVM 還是非常智能的。類似的,final 字段對性能的影響,大部分情況下,并沒有考慮的必要。
從開發實踐的角度,我不想過度強調這一點,這是和 JVM 的實現很相關的,未經驗證比較難以把握。我的建議是,在日常開發中,除非有特別考慮,不然最好不要指望這種小技巧帶來的所謂性能好處,程序最好是體現它的語義目的。如果你確實對這方面有興趣,可以查閱相關資料,我就不再贅述了,不過千萬別忘了驗證一下。
對于 finally
明確知道怎么使用就足夠了。需要關閉的連接等資源,更推薦使用 Java 7 中添加的 try-with-resources 語句,因為通常 Java 平臺能夠更好地處理異常情況,編碼量也要少很多,何樂而不為呢。
注意事項
finally代碼不會被執行的特例:
final修飾的List,不會影響其行為:
final只能約束strList這個引用不可以被賦值,但是strList對象行為不被final影響,添加元素的操作是完全正常的。如果我們真的希望對象本身是不可變的,那么需要相應的類支持不可變的行為。
在上面的例子中,List.of方法創建的就是不可變List,最后那句add會在運行時拋出異常。
Java平臺目前在逐步使用java.lang.ref.Cleaner來替換掉原來的finalize實現。
對于 finalize
我們要明確它是不推薦使用的,業界實踐一再證明它不是個好的辦法,在 Java 9 中,甚至明確將 Object.finalize() 標記為 deprecated!如果沒有特別的原因,不要實現 finalize 方法,也不要指望利用它來進行資源回收。
為什么呢?簡單說,你無法保證 finalize 什么時候執行,執行的是否符合預期。使用不當會影響性能,導致程序死鎖、掛起等。
通常來說,利用上面的提到的 try-with-resources 或者 try-finally 機制,是非常好的回收資源的辦法。如果確實需要額外處理,可以考慮 Java 提供的 Cleaner 機制或者其他替代方法。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。