Java問題解讀系列之String相關---String類為什么是final的?


今天看到一篇名為《Java開發崗位面試題歸類匯總》的博客,戳進去看了一下題目,覺得有必要夯實一下基本功了,所以打算邊學邊以博客的形式歸納總結,每天一道題,

並將該計划稱為java問題解讀系列,今天的題目是:String類為什么是final的?

在回答這個問題之前,我覺得有必要搞清楚final到底是個什么?

一、理解final

望文生義,final意為“最終的,最后的”,我理解為“不能被改變的”,它可以修飾類、變量和方法。

所以我是否可以理解為被它所修飾的類、變量和方法都不能被改變呢?答案是”是“,因為有以下約束條件的存在:

1、final修飾類

被final修飾的類不能被繼承,即它不能擁有自己的子類,否在會在編譯期間報錯。且看下面的例子:

第一步:創建一個用final修飾的父類Father

第二步:創建一個子類Son繼承Father

如圖所示,我們看到了報警信息,點進去一看,如下圖所示:

意思就是類Son不能繼承被final修飾的類Father,上面的結論得以印證。

2、final修飾方法

被final修飾的方法不能被重寫

詳情且看下面的實例:

(一)父類中的方法控制權限為public

第一步:在Father類中創建一個方法,並用final修飾

第二步:用類Son繼承類Father並重寫work方法

可以看到當子類重寫父類中用final修飾的方法時,報錯了,報錯信息如下:

即子類不能重寫父類中被final修飾的方法

 3、final修飾變量

final修飾的變量,無論是類屬性、對象屬性、形參還是局部變量,都需要進行初始化操作。

(1)修飾變量

可以看到被final修飾的變量報錯了,報錯信息如下:

意為被final修飾的字段language沒有被初始化,所以當變量被final修飾時要賦值初始化,如下:

(2)修飾類屬性

類屬性可以理解為一個將一個類作為另一個類的屬性

第一步:先創建一個特征類

第二步:將特征類Feature設置為Son類的屬性,並用final修飾

同樣當類屬性用final修飾時報錯了,報錯信息如下:

同樣,報錯信息為沒有進行對final修飾的類進行初始化,下面看一下不用final修飾時是否報錯:

很明顯,答案是沒有,那再來看一下當初始化Feature類后又會是怎樣的?

可以看到,初始化用fina修飾的屬性類后並沒有報錯,上面的結論也得以印證了!

二、解答問題

結合以上基礎知識,我們來分析一下為什么String類是final的?

首先來看一個例子:

上面這個例子,是讓一個普通類繼承String類,結果發現報錯了,錯誤信息如下:

即類String1不能是final類String的子類,這里已經很明顯地看出String類是final的,但是到底是為了什么呢?先給出答案吧:

主要是為了”安全性“和”效率“的緣故,因為:

1、由於String類不能被繼承,所以就不會沒修改,這就避免了因為繼承引起的安全隱患;

2、String類在程序中出現的頻率比較高,如果為了避免安全隱患,在它每次出現時都用final來修飾,這無疑會降低程序的執行效率,所以干脆直接將其設為final一提高效率;

下面是我在其他人的博客中發現的一個很有趣也很有價值的答案,截圖拿來參考一下這位高人的解釋:

以上就是我通過調研對本次問題的理解,如有不足或錯誤之處,望看到這篇文章的你能給予指點和批評,未完待續......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM