String 是否可以被继承,为什么

String 不能被继承的原因

不能被继承,因为 String 类有 final 修饰符,而 final 修饰的类是不能被继承的。

Java 对 String 类的定义:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    // 省略... 
}

String 被 final 修饰的原因

Java 语言之父 James Gosling 的回答是,他会更倾向于使用

final,因为它能够缓存结果,当你在传参时不需要考虑谁会修改它的值;如果是可变类的话,则有可能需要重新拷贝出来一个新值进行传参,这样在性能上就会有一定的损失。

James Gosling 还说:迫使 String

类设计成不可变的另一个原因是安全,当你在调用其他方法时,比如调用一些系统级操作指令之前,可能会有一系列校验,如果是可变类的话,可能在你校验过后,它的内部的值又被改变了,这样有可能会引起严重的系统崩溃问题,这是迫使

String 类设计成不可变类的一个重要原因。

总结来说,使用 final 修饰的第一个好处是安全;第二个好处是高效,以 JVM 中的字符串常量池来举例,如下两个变量:

String s1 = "java";

String s2 = "java";

只有字符串是不可变时,我们才能实现字符串常量池,字符串常量池可以为我们缓存字符串,提高程序的运行效率,如下图所示:
clipboard.png

Java final 修饰符知识点总结