我正在查看 Sun 认证学习指南,其中有一段描述了最终修饰符。它说
“如果程序员可以自由扩展我们所知的 String 类文明,它可能会崩溃”
他是什么意思? 如果可以扩展 String 类……我会不会有一个名为 MyString 的类继承所有 Strings 属性。 仅通过扩展它怎么可能以任何方式更改实际的 String 类?
非常感谢您的回答
最佳答案
嗯,一个问题是,如果您可以子类化 String 类,您很可能会以无数种方式破坏 jvm 的安全性。许多权限检查各种字符串值以确定是否允许给定操作。如果您的代码正在提供字符串值,那么您可以返回一个 String 实例,当安全管理器查看它时,该实例会“ checkout ”,但稍后会充当一个完全不同的值。
例如,假设您有一些敏感的 jvm 范围配置:
public static void registerProvider(String providerName, Provider impl) {
SecurityManager sm = ...;
if(sm != null) {
// say the check provider method doesn't allow strings starting with "com.sun."
sm.checkProvider(providerName);
}
_providerMap.put(providerName, impl);
}
现在,我实现了一个自定义字符串,它覆盖 startsWith()
方法以在传递值 "com.sun."时返回
,但我的字符串的实际值确实以 false
。com.sun.
开头。
当然,更不用说对字符串不可变的普遍期望,如果它被破坏,可能会导致各种普遍的破坏(如其他答案中更详细所述)。
关于Java继承,扩展类如何影响实际类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15165619/