跳转至

String 类能被继承吗?为什么?

结论

不能Stringfinal 修饰,不能被继承。

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

为什么设计成 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,可以继承,但实际没人这么做。
  • IntegerLong 等包装类也都是 final。