String类为什么是final笔者总结

主要是为了“效率” 和 “安全性” 的缘故。
1.性能(效率)
如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。
2.安全性
String类的内部好多方法的实现都不是Java编程语言本身编写的,好多方法都是调用的操作系统本地的API,也就是“本地方法调用”,这种类是非常底层的,和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的,这不就成了核心病毒了么? 
3.天生服务性
当时设计时,就是不希望别人改,这个类就像一个工具一样,类的提供者给我们提供了,就希望我们直接用就完了,不想让我们随便能改,其实说白了还是安全性,如果随便能改了,那么Java编写的程序肯定就很不稳定。

各家风云

最佳答案:

主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

其它答案一:

String和其他基本类型不同,他是个对象类型.既然是对象类型,如果是在静态方法下是必须调用静态方法或值的,如果是非静态的方法,就必须要实例化. 
main函数是个static的.所以String要能像其他的基本类型一样直接被调用.这也是为什么在main函数下使用String类型不会报告错误的原因.. 
一下就解释了两个心里的疑问.. 
以前一直觉得奇怪,为什么String是对象类型在main函数下却是不需要实例化的.再次佩服java设计人员想得真周到.

其它答案二:

当定义String类型的静态字段(也成类字段),可以用静态变量(非final)代替常量(final)加快程序速度。反之,对于原始数据类型,例如int,也成立。

例如,你可能创建一个如下的String对象:

private static final String x = "example";

对于这个静态常量(由final关键字标识),你使用常量的每个时候都会创建一个临时的String对象。在字节代码中,编译器去掉”x”,代替它的是字符串“example”,以致每次引用”x”时VM都会进行一次哈希表查询。

相比之下,度于静态变量(非final关键字),字符串只创建一次。仅当初始化“x”时,VM才进行哈希表查询。

还有另一个解释: 
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。

  另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。

示例:

public class Test { 
public static void main(String[] args)  { 
//  

}

如果String 不是final 那么就可以继承 
public class String2 extends String{ 
   // .. 
   // ... 
}

那我们的 main也就可以写成 
public class Test { 
public static void main(String2[] args)  { // 注意此处 
//  

}

英文参考:http://forums.sun.com/thread.jspa?threadID=636414

=============================================================

另外补充一点:

引用:http://zhidao.baidu.com/question/94324055.html
作用就是 final的类不能被继承,不能让别人继承有什么好处? 
意义就在于,安全性,如此这般: 
Java自出生那天起就是“为人民服务”,这也就是为什么Java做不了病毒,也不一定非得是病毒,反正总之就是为了安全,人家Java的开发者目的就是不想让Java干这类危险的事儿,Java并不是操作系统本地语言,换句话说Java必须借助操作系统本身的力量才能做事,JDK中提供的好多核心类比如String,这类的类的内部好多方法的实现都不是Java编程语言本身编写的,好多方法都是调用的操作系统本地的API,这就是著名的“本地方法调用”,也只有这样才能做事,这种类是非常底层的,和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的,这不就成了核心病毒了么? 
--- 
上面所述是最重要的,另外一个方面,上面2位老兄说的也都很对,就是不希望别人改,这个类就像一个工具一样,类的提供者给我们提供了,就希望我们直接用就完了,不想让我们随便能改,其实说白了还是安全性,如果随便能改了,那么Java编写的程序肯定就很不稳定,你可以保证自己不乱改,但是将来一个项目好多人来做,管不了别人,再说有时候万一疏忽了呢?他也不是估计的,所以这个安全性是很重要的,Java和C++相比,优点之一就包括这一点;
---
原因绝对不只有这么多,因为如果这些个核心的类都能被随便操作的话,那是很恐怖的,会出现好多好多未知的错误,莫名其妙的错误....

String类为什么是final相关推荐

  1. String类为什么是final的

    String类为什么是final的 我觉得这个回答让我更明白一些: https://www.zhihu.com/question/31345592 posted on 2018-03-20 16:13 ...

  2. 为什么jdk中把String类设计成final

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 为什么j ...

  3. java问题解读,String类为什么是final的

    一.理解final 望文生义,final意为"最终的,最后的",我理解为"不能被改变的",它可以修饰类.变量和方法. 所以我是否可以理解为被它所修饰的类.变量和 ...

  4. String类为什么是final类型?

    首先,先得清楚 final 这个关键字. final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率. final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡 ...

  5. 17.Java常用实用类之String类中常用的方法以及一般应用场景,final关键字

    文章目录 1.String类学习 1.1.什么是String类 1.2.String类中常用的方法 1.2.1. 构造方法 1.2.2.public int length() 1.2.3.public ...

  6. JDK1.8源码(三)——java.lang.String 类

    String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类. 1.String 类的定义 public final class ...

  7. c++ string replace_Java——String类的常用方法总结

    点击上方"IT咸鱼",星标公众号重磅干货,第一时间送达 一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象. ...

  8. Java面试题 String类能不能被继承?为什么?

    不能,因为string类是被final修饰的类,final修饰过的类不能被继承.final修饰过的变量不能被修改.

  9. JAVAAPI之STRING类和STRINGBUFER类

    1.Stirng类的初始化 范例:String name="梁东振"; 2.String类的常见操作 -----------字符串的基本操作------------------ 范 ...

最新文章

  1. 团体——L1-005 考试座位号 (15 分)
  2. Android HttpClient post MultipartEntity - Android 上传文件
  3. 安装 | MatlabR2021b链接及Matlabx运行图基本运行代码与图像
  4. 几个有用的Linux命令
  5. 【计算机网络】TCP/IP 模型与OSI参考模型的比较
  6. i2c通信 msp430g2553_msp430g2553的IIC通信
  7. python免费网课-python网课资源
  8. FastHook——实现.dynsym段和.symtab段符号查询
  9. 再谈如何以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式
  10. (7)numpy.delete删除np数组的某一行或某一列
  11. ​LeetCode刷题实战317:离建筑物最近的距离
  12. 安卓选择市区的省市区联动
  13. springboot二手车交易系统毕业设计源码131456
  14. matlab 如何统计矩阵中大于、小于或等于某一值的位置、个数
  15. 运筹说 第29期 | 对偶理论与灵敏度分析—影子价格
  16. Mac电脑的强大压缩工具——FastZip,加密压缩。
  17. utl raw mysql_oracle中utl_raw
  18. 化纤与纺织技术杂志化纤与纺织技术杂志社化纤与纺织技术编辑部2022年第2期目录
  19. QT自定义简单表盘(完整代码)
  20. 好的软文推广都使用了哪些方法?

热门文章

  1. 二十三、图的广度优先遍历
  2. mysql空洞_optimize table 删除空洞--MYSQL
  3. 3 镜像仓库Harbor安装
  4. C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 返回多个值
  5. Cache与主存的三种映射
  6. [ARM异常]-SPIs(共享中断)routing到指定CPU的方法
  7. 密码篇——对称加密—3DES
  8. (44)MessageBoxA 监视器(过写拷贝,不使用 shellcode 注入)
  9. 2ex1逆向寒假生涯(24/100)
  10. 常见的钓鱼招式,可千万别入坑哦