Java继承,扩展类如何影响实际类

标签 java inheritance final

我正在查看 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/

相关文章:

Java "trick", 重新定义子类成员

java - Spring 启动 : Mocking SOAP Web Service

angular - TypeScript 错误 - TS2340 公共(public)方法可通过 'super' 关键字访问

c# - 从 "base.base"类调用方法?

java - 删除 final 关键字如何改变程序的行为方式?

java - 为什么编译器拒绝访问 lambda 中的非最终变量

java - 使用 knockout.js 和 Spring MVC/JSP 的初始状态

java - 如何散列复合类?

java - 使用自定义转换器映射对象类型

java - 方法中final变量声明的作用是什么?