String類

String的final特性:

       關於String,是一個final類,所以沒法被繼承,jdk的設計者不但願咱們去繼承,去擴展這個類,由於這個類已經寫得很好了,亦或者防止繼承這個類後,植入惡意代碼,畢竟在java中執行方法是後期綁定。若是被壞人植入惡意代碼就很差了,當傳入參數運行,就很差了。java

以上面試題可能會問到:String類能不能被繼承?爲何?有什麼好處?·····面試

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的值。由於並無接口讓咱們去修改。

由此造成了一個常量池~~~

相關文章
相關標籤/搜索