String類為什么是final


最佳答案:

主要是為了“效率” 和 “安全性” 的緣故。若 String允許被繼承, 由於它的高度被使用率, 可能會降低程序的性能,所以String被定義成final。

其它答案一:

String和其他基本類型不同,他是個對象類型.既然是對象類型,如果是在靜態方法下是必須調用靜態方法或值的,如果是非靜態的方法,就必須要實例化. 
main函數是個static的.所以String要能像其他的基本類型一樣直接被調用.這也是為什么在main函數下使用String類型不會報告錯誤的原因.. 
一下就解釋了兩個心里的疑問.. 
以前一直覺得奇怪,為什么String是對象類型在main函數下卻是不需要實例化的.再次佩服java設計人員想得真周到.

 

其它答案二:

當定義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%。

示例:

public class Test { 
public static void main(String[] args)  { 
//  



如果String 不是final 那么就可以繼承 
public class String2 extends String{ 
   // .. 
   // ... 


那我們的 main也就可以寫成 
public class Test { 
public static void main(String2[] args)  { // 注意此處 
//  

}

英文參考:http://forums.sun.com/thread.jspa?threadID=636414

=============================================================

另外補充一點:

引用:http://zhidao.baidu.com/question/94324055.html
作用就是 final的類不能被繼承,不能讓別人繼承有什么好處? 
意義就在於,安全性,如此這般: 
Java自出生那天起就是“為人民服務”,這也就是為什么Java做不了病毒,也不一定非得是病毒,反正總之就是為了安全,人家Java的開發者目的就是不想讓Java干這類危險的事兒,Java並不是操作系統本地語言,換句話說Java必須借助操作系統本身的力量才能做事,JDK中提供的好多核心類比如String,這類的類的內部好多方法的實現都不是Java編程語言本身編寫的,好多方法都是調用的操作系統本地的API,這就是著名的“本地方法調用”,也只有這樣才能做事,這種類是非常底層的,和操作系統交流頻繁的,那么如果這種類可以被繼承的話,如果我們再把它的方法重寫了,往操作系統內部寫入一段具有惡意攻擊性質的代碼什么的,這不就成了核心病毒了么? 
--- 
上面所述是最重要的,另外一個方面,上面2位老兄說的也都很對,就是不希望別人改,這個類就像一個工具一樣,類的提供者給我們提供了,就希望我們直接用就完了,不想讓我們隨便能改,其實說白了還是安全性,如果隨便能改了,那么Java編寫的程序肯定就很不穩定,你可以保證自己不亂改,但是將來一個項目好多人來做,管不了別人,再說有時候萬一疏忽了呢?他也不是估計的,所以這個安全性是很重要的,Java和C++相比,優點之一就包括這一點;
---
原因絕對不只有這么多,因為如果這些個核心的類都能被隨便操作的話,那是很恐怖的,會出現好多好多未知的錯誤,莫名其妙的錯誤.... 

【轉載】http://blog.csdn.net/fenglibing/article/details/5486449


免責聲明!

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



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