String類為什麼是final的?
在回答這個問題之前,我覺得有必要搞清楚final到底是個什麼?
一、理解final
望文生義,final意為“最終的,最後的”,我理解為“不能被改變的”,它可以修飾類、變數和方法。
所以我是否可以理解為被它所修飾的類、變數和方法都不能被改變呢?答案是”是“,因為有以下約束條件的存在:
1、final修飾類
被final修飾的類不能被繼承,即它不能擁有自己的子類,否在會在編譯期間報錯。且看下面的例子:
第一步:建立一個用final修飾的父類Father
第二步:建立一個子類Son繼承Father
如圖所示,我們看到了報警資訊,點進去一看,如下圖所示:
意思就是類Son不能繼承被final修飾的類Father,上面的結論得以印證。
2、final修飾方法
被final修飾的方法不能被重寫,但是:
重寫的前提是子類可以從父類中繼承此方法,所以當父類中被final修飾的方法的訪問許可權為private時,子類中就可以重寫該方法了。
詳情且看下面的例項:
(一)父類中的方法控制權限為public
第一步:在Father類中建立一個方法,並用final修飾
第二步:用類Son繼承類Father並重寫work方法
可以看到當子類重寫父類中用final修飾的方法時,報錯了,報錯資訊如下:
即子類不能重寫父類中被final修飾的方法
下面看另一種情況
(二)父類中的方法控制權限為private
第一步:在Father類中建立一個方法,並用final修飾
第二步:用類Son繼承類Father並重寫work方法
可以看到程式沒有報錯,黃色下劃線的warning如下所示:
意為該方法沒有被使用,而當我把方法的控制權限改為public並且不用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一提高效率;
下面是我在其他人的部落格中發現的一個很有趣也很有價值的答案,截圖拿來參考一下這位高人的解釋:
相關推薦
在java中String類為什麽要設計成final?
tro cli lai 這一 引用 沒有 num 重新 static 大神鏈接:在java中String類為什麽要設計成final? - 程序員 - 知乎 我進行了重新排版,並且更換了其中的一個例子,讓我們更好理解。 String很多實用的特性,比如說“不可變性”,是工
java裏String類為何被設計為final
使用 hashtable 方向 memory 思維 per 垃圾收集器 其他 tro 前些天面試遇到一個非常難的關於String的問題,“String為何被設計為不可變的”?類似的問題也有“String為何被設計為final?”個人認為還是前面一種問法更準確,設計成fi
在Java中String類為什麽要設計成final?String真的不可變嗎?其他基本類型的包裝類也是不可變的嗎?
數據 pri 創建 long tde 繼承 set 字符串常量 通過 最近突然被問到String為什麽被設計為不可變,當時有點懵,這個問題一直像bug一樣存在,竟然沒有發現,沒有思考到,在此總結一下。 1.String的不可變String類被final修飾,是不可繼承和修改
String類為什麼是final的
一、理解final 望文生義,final意為“最終的,最後的”,我理解為“不能被改變的”,它可以修飾類、變數和方法。 所以我是否可以理解為被它所修飾的類、變數和方法都不能被改變呢?答案是”是“,因為有以下約束條件的存在: 1、final修飾類 被final修飾的類不能
在Java中String類為什麼要設計成final?String真的不可變嗎?其他基本型別的包裝類也是不可變的嗎?
最近突然被問到String為什麼被設計為不可變,當時有點懵,這個問題一直像bug一樣存在,竟然沒有發現,沒有思考到,在此總結一下。 1.String的不可變 String類被final修飾,是不可繼承和修改的。當一個String變數被第二次賦值時,不是在原有記憶體地址上修改資料,而是在記憶體中重
String類為什麼是final的?
在回答這個問題之前,我覺得有必要搞清楚final到底是個什麼? 一、理解final 望文生義,final意為“最終的,最後的”,我理解為“不能被改變的”,它可以修飾類、變數和方法。 所以我是否可以理解為被它所修飾的類、變數和方法都不能被改變呢?答案是”是“,因為有以下約
String類設計成final的原因
我進行了重新排版,並且更換了其中的一個例子,讓我們更好理解。 String很多實用的特性,比如說“不可變性”,是工程師精心設計的藝術品!藝術品易碎!用final就是拒絕繼承,防止世界被熊孩子破壞,維護世界和平! 1. 什麼是不可變? String不可變很簡單,如下圖,給一個已有字串“abcd”第二次賦
【小家java】String類為什麼要設計成final?不可變有什麼優點?
相關閱讀 原始碼解釋: 先貼一下String類的申明程式碼: public final class String implements java.io.Serializable, Comparable<String>, CharSeque
為什麼String類是final?
要理解這個問題,需要先了解以下幾點: (1)immutable ——不可改變 (2)字串池——String pool ①immutable class/Object 不可改變類——是指類的狀態不變,一旦建立,狀態就是固定不變的 ②字串池 Stri
JAVA中String為final修飾類
final意義:最終的,不可改變的 1. 修飾變數,為常量,值不可變; 2. 修飾物件,值可變,引用不變; 3. 修飾方法,方法不可重寫; 4. 修飾類,無子類,不可以被繼承,更不可能被重寫 String是java中的基本型別,使
追根溯源---java.lang.String類為什麼是final的?
java.lang.String類為什麼設計成 final 的? 首先,先得清楚 final 這個關鍵字。 final的出現就是為了為了不想改變,而不想改變的理由有兩點:設計或者效率。final 修飾的類是不被能繼承的,所以 final 修飾的類是不能被篡改
Java中,String類是final類?
java中的String類是final類,是不可以被繼承的。 既然是final類,那String為什麼又可以不斷地被更改值呢? 其實,與其說String變數被改變值,倒不如說是String變數指向的路徑發生了改變。 由於final限制不能直接改變的是值,是最終結果,而Str
java中String的final類原因
安全 implement div 就是 final nal 原因 其他 特點 public final class String implements java.io.Serializable, Comparable<String>, CharSequenc
基本數據類型,string類型的瞎扯,final喜歡幹的事兒。final string
不同 類比 喜歡 tro 指向 都沒有 style 是什麽 工具 Java的兩大數據類型:基本數據類型/內置數據類型;引用數據類型。 基本數據類型:java提供了8種,6種數字類型,1種字符類型,1種布爾類型。 6中數字類型中有4個整數類型,2個浮點型。整數類型是:
java學習筆記——String類
通過 ray [] 原理 log spl 2.3 -s 長度 一、概述 ·字符串是一個特殊的對象 ·字符串一旦初始化就不可以被改變 ·String str = "abc"; ·String str1 = new String("abc"); 有什麽區別? package
java中String類型轉換為yyyy-MM-dd的Date類型
col code edate birt mat led div get sys String birthday ="2017-02-22"; SimpleDateFormat sdf = new SimpleDateFormat(("yyyy-MM-dd")); jav
Java學習筆記——String類型轉換
世界 java學習筆記 getc [] bool bsp ati nbsp ole 一滴水裏觀滄海,一粒沙中看世界 ——一帶一路歡迎宴致辭 上代碼: 1 package cn.stringtoobj; 2 3 public
Java String類
count 包含 第一個字母大寫 獲取 rgs ret lower charat index 1 package demo03; 2 3 //String類的構造方法 4 public class StringDemo { 5 public stati
按行讀取String類型
類型 char logs ont log read pan nbsp span BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(content.ge
JAVA API(一)String類和StringBuffer類
art com 依次 區別 del 索引 第一個字符 cde 基本 1.String類和StringBuffer類 在程序中經常會用到字符串,所謂的字符串就是指一連串的字符,它是由多個單個字符連接而成的。字符串中可以包含任意字符,這些字符必須包含在一對雙引號""之內,如"a