zoukankan      html  css  js  c++  java
  • Java里的String类为什么是final的

    今天在看《图解设计模式》,里面出了一个问题“String类用final修饰,导致它无法被继承(扩展),这样做违反了开闭原则,这么做有什么正当理由?”

    答案是效率安全性 

    首先是效率,由于String类它基本上是最频繁使用的几个类之一,如果使用的不好,会出现很明显的性能问题。所以干脆做成final类的。可以在JVM里做很多优化(比如放在栈中重用),类似的还有StringBuilder,虽然都是操作字符串,但是存放机制和使用场景都不同。

    另外再说安全性,引用网上一段段“Java并不是操作系统本地语言,换句话说Java必须借助操作系统本身的力量才能做事,JDK中提供的好多核心类比如String,这类的类的内部好多方法的实现都不是Java编程语言本身编写的,好多方法都是调用的操作系统本地的API,这就是著名的“本地方法调用”,也只有这样才能做事,这种类是非常底层的,和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的,这不就成了核心病毒了么? ”。

    我个人的理解是,正因为String是final类的,所以我们只能把它作为工具是使用它,而不能修改它。而String类里由于调用了操作系统的底层方法,如果我们可以继承final类,则可能会破坏JAVA的安全机制,直接调用父类的方法去操作系统。这明显是有违JAVA语言设计的初衷的。

  • 相关阅读:
    ZT:POI操作PPT
    ADO.NET 2.0 Dataset和Datatable 新功能新特性
    ADO.NET 2.0 大批量数据操作和多个动态的结果集
    浏览.NET Framework 2.0 类型库中新增的常用功能
    ASP.NET程序中常用代码汇总(四)
    保存div与页面滚动条的位置
    在ASP.NET中实现AJAX
    ASP.NET 2.0中隐藏listbox的某一项
    泛型最佳实践C#
    ASP.NET 2.0 验证控件新的功能
  • 原文地址:https://www.cnblogs.com/xujanus/p/9234150.html
Copyright © 2011-2022 走看看