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

drl*_*obo 8 java inheritance final

我正在审查Sun认证研究指南,并且有一篇描述最终修饰符的段落.它说

"如果程序员可以自由扩展String类文明,因为我们知道它可能会崩溃"

他什么意思 ?如果可以扩展String Class ...我只是没有一个名为MyString的类继承了所有的Strings属性.如何通过仅扩展它来以任何方式更改实际的String类?

非常感谢您的回答

jta*_*orn 6

好吧,一个问题是,如果你可以继承String类,你很可能以各种方式破坏jvm的安全性.许多权限检查各种String值以确定是否允许给定操作.如果您的代码提供了字符串值,那么您可以返回一个String实例,该实例在安全管理器查看它时"检出",但后来的行为就像一个完全不同的值.

例如,假设您有一些敏感的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);
}
Run Code Online (Sandbox Code Playgroud)

现在,我实现了一个自定义String,如果传递了值,它将覆盖startsWith()要返回的方法,但我的String的实际值确实以.false"com.sun."com.sun.

当然,更不用说字符串的一般期望是不可改变的,如果破坏,可能会导致各种一般的破坏(在其他答案中更详细地提到).


par*_*fal 4

扩展类不会影响基类。然而,它可能会影响基类的消费者。

因此,假设您能够扩展String,您可以编写如下内容:

class MyString extends String {

    @Override
    public int length() {
        System.exit();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您将此类传递给任何使用字符串的程序,您很可能会快速退出程序。不是文明的终结,但你可以做一些更险恶的事情。