1. 程式人生 > >String類無子類

String類無子類

根據 如果 資源 nbsp 允許 父類 抽象類 性能 net

1. 關於final修飾符

參考文章:
淺析Java中的final關鍵字

根據程序上下文環境,Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而需要阻止改變:設計或效率。
  final類不能被繼承,沒有子類,final類中的方法默認是final的。
  final方法不能被子類的方法覆蓋,但可以被繼承。
  final成員變量表示常量,只能被賦值一次,賦值後值不再改變。
  final不能用於修飾構造方法。
  註意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。

如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
  使用final方法的原因有二:
  第一、把方法鎖定,防止任何繼承類修改它的意義和實現。
  第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。(這點有待商榷,《Java編程思想》中對於這點存疑)

下面這段話摘自《Java編程思想》第四版第143頁:
“使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。“

2. 關於String類

參考文章:
Java中的堆、棧和常量池
Java堆、棧和常量池以及相關String的詳細講解(經典中的經典)
什麽是字符串常量池?
Java中的String為什麽是不可變的? – String源碼分析

關於String類,要了解常量池的概念

String s = new String(“xyz”);  //創建了幾個對象

答案: 1個或2個, 如果”xyz”已經存在於常量池中,則只在堆中創建”xyz”對象的一個拷貝,否則還要在常量池中在創建一份

String s = "a"+"b"+"c"+"d"; //創建了幾個對象

答案: 這個和JVM實現有關, 如果常量池為空,可能是1個也可能是7個等

3. 相關類: StringBuffer, StringBuilder

參考文章:
String,StringBuffer與StringBuilder的區別
String StringBuilder StringBuffer 對比 總結得非常好
從源代碼的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接

String為immutable, 不可更改的,每次String對象做累加時都會創建StringBuilder對象, 效率低下。

// 程序編譯期即加載完成對象s1為"ab",JVM自有優化, 效率並不差
String s1 = "a" + "b";  

// 這種方式,JVM會先創建一個StringBuilder,然後通過其append方法完成累加操作,比較耗資源
// 所以在循環中做字符串累加賦值時應當使用StringBuilder或StringBuffer類
String s1 = "a";
String s2 = "b"; 
String s3 = s1 + s2; // 等效於 String s3 = (new StringBuilder(s1)).append(s2).toString();

String是final類,不能有子類

String類無子類