關於String,是一個final類,所以沒法被繼承,jdk的設計者不但願咱們去繼承,去擴展這個類,由於這個類已經寫得很好了,亦或者防止繼承這個類後,植入惡意代碼,畢竟在java中執行方法是後期綁定。若是被壞人植入惡意代碼就很差了,當傳入參數運行,就很差了。java
以上面試題可能會問到:String類能不能被繼承?爲何?有什麼好處?·····面試
/** The value is used for character storage. */ private final char value[];
這是String類中的定義,是一個char數組,因爲是被final修飾的,註定有一被初始化就沒法改變的特性。數組
ps:被final修飾的的只是char數組的指向不能更改,好比下面的代碼:數據結構
final char[] ch1={'1','2','3','4','5'}; char[] ch2={'5','4','3','2','1'}; ch1=ch2;//這是錯誤的
顯然這種代碼是編譯不經過的,由於ch1的指向沒法更改,雖然指針沒法更改,可是ch1數組的具體內容仍是能修改的,如char[0],char[1]卻能夠更改,:spa
final char[] ch1={'1','2','3','4','5'}; ch1[0]='a'; for (char c : ch1) { System.out.print(c); }
----------控制檯輸出------------------設計
所以,String類中的char數組又被private修飾,由於做者不想把底層的數據結構暴露出去,被直接修改。指針
所以String類對象存在於常量池中。一旦初始化,就不能被修改,是由於jdk沒有提供一個修改的接口給咱們。code
今天有看到String類,char數組是被final修飾的,那麼:對象
String str="123"; str="456";
這段代碼是怎麼執行的呢?blog
str裏面的value沒法修改,那麼又是經過什麼修改了str的內容呢?
不是說好的不能修改嗎?
難道 等號 jdk作了特殊處理?讓他修改了char數組的內容嗎?
那也不對啊,若是超出了以前的長度不就異常了?
首先copy百度回答的:
9.2.2 不可變字符串與限定字符串
String對象是不可變的,它的內容是不能改變的。下列代碼會改變字符串的內容嗎?
String s = "Java"; s = "HTML";
答案是不能。
第一條語句建立了一個內容爲"Java"的String對象,並將其引用賦值給s。
第二條語句建立了一個內容爲"HTML"的新String對象,並將其引用賦值給s。
賦值後第一個String對象仍然存在,可是不能再訪問它,由於變量s如今指向了新的對象,如圖。
所以,在第二行代碼中的 雙引號 相似於 new String(「HTML」);
這個又相似於包裝類跟基本類型,能夠自動拆箱裝箱吧?
因爲咱們失去的對Java 這個String類對象的引用,所以咱們沒法更改他了,就算有,也沒法修改value的值。由於並無接口讓咱們去修改。
由此造成了一個常量池~~~