在java中string為什么要設計成final的


各種不同的理解
 
1
將方法或類聲明為final主要目的是:確保它們不會再子類中改變語義。String類是final類,這意味着不允許任何人定義String的子類。換言之,如果有一個String的引用,它引用的一定是一個String對象,而不可能是其他類的對象。
——《Java核心技術 卷I》
 
2
舉個例子:一個方法可能本來接受String類型並返回其大寫方式
public static String uppperString(String s){ return s.toUpperCase(); } 

你傳入String 的s="test", 他不會修改字符串池中"test", 而是直接新建立一個實例"TEST"返回。但如果你的StringChild的toUpperCase()被你重寫(override)為mutable的方式,然后你調用這個方法的時候傳入的是StringChild實例, 那么整體(依賴於(過)方法uppperString的所有類)的行為就有可能出現錯亂。

要知道,String是幾乎每個類都會使用的類,特別是作為Hashmap之類的集合的key值時候,mutable的String有非常大的風險。而且一旦發生,非常難發現。聲明String為final一勞永逸。

3
String objects are immutable, which means that once created, their values cannot be changed. The String class is not technically a primitive data type, but considering the special support given to it by the language, you'll probably tend to think of it as such.
 
4
String 之所以是final的是因為 面向對象語言的特性: 類的多態,以及String被超級廣泛的使用所決定的。

假設String不是final修飾,而是可以繼承的。 設計一個類MyString 繼承 String, 重寫length(),並返回0。

在需要用到String對象的地方,使用的是MyString 對象,因為 類的多態,不會出現任何編譯錯誤,但是后果 。。。。

5
String和其他基本類型不同,他是個對象類型.既然是對象類型,如果是在靜態方法下是必須調用靜態方法或值的,如果是非靜態的方法,就必須要實例化
main函數是個static的.所以String要能像其他的基本類型一樣直接被調用.這也是為什么在main函數下使用String類型不會報告錯誤的原因.. 
一下就解釋了兩個心里的疑問.. 
以前一直覺得奇怪,為什么String是對象類型在main函數下卻是不需要實例化的.再次佩服java設計人員想得真周到.
 
6
當定義 String類型的靜態字段(也成類字段),可以用靜態變量(非final)代替常量(final)加快程序速度。反之,對於原始數據類型,例如int,也成立。 

例如,你可能創建一個如下的String對象: 

private static final String x = "example"; 

對於這個靜態常量(由final關鍵字標識),你使用常量的每個時候都會創建一個臨時的String對象。在字節代碼中,編譯器去掉”x”,代替它的是字符串“example”,以致每次引用”x”時VM都會進行一次哈希表查詢。 

相比之下,度於靜態變量(非final關鍵字),字符串只創建一次。僅當初始化“x”時,VM才進行哈希表查詢。 

還有另一個解釋
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。 

  另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50%。


 






免責聲明!

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



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