Java中是否可以繼承String類,為什么


Java中,是否可以繼承String類?為什么?

答案: 不可以,因為String類有final修飾符,而final修飾的類是不能被繼承的,實現細節不允許改變。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence 
  • 1
  • 1

詳細解析:

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();

 

StringBuffer是線程安全的 
StringBuilder(5.0版本后添加的類,是StringBuffer的一個簡單替換)為非線程安全的,但是效率會好些,在單線程環境中要做大量字符串累加時推薦使用該類


免責聲明!

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



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