String 类能被继承吗?为什么?¶
结论¶
不能。String 被 final 修饰,不能被继承。
为什么设计成 final¶
1. 安全¶
String 是 Java 中最常用的类型,类加载器、网络连接、文件路径都用它。如果可继承,攻击者可以替换成自己的子类,改变行为。
例如: - 你以为拿到的是 "file.txt",实际是恶意子类,打开了别的文件。 - 类加载器用 String 标识类名,子类篡改会导致加载恶意类。
2. 不可变¶
String 不可变是安全的基础。final 保证子类不能重写方法破坏不可变语义。
3. 哈希可缓存¶
因为不可变,String 的 hashCode 可以缓存,作为 HashMap key 才高效。
4. 字符串常量池共享¶
多线程共享 String 常量,不可变才安全。
不能继承意味着什么¶
- 不能
class MyString extends String。 - 想扩展 String 功能,用工具类(如
StringUtils)或组合。
对比
StringBuilder不是 final,可以继承,但实际没人这么做。Integer、Long等包装类也都是 final。