String类为什么是final
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相关推荐
- String类为什么是final的
String类为什么是final的 我觉得这个回答让我更明白一些: https://www.zhihu.com/question/31345592 posted on 2018-03-20 16:13 ...
- 为什么jdk中把String类设计成final
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 为什么j ...
- java问题解读,String类为什么是final的
一.理解final 望文生义,final意为"最终的,最后的",我理解为"不能被改变的",它可以修饰类.变量和方法. 所以我是否可以理解为被它所修饰的类.变量和 ...
- String类为什么是final类型?
首先,先得清楚 final 这个关键字. final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率. final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡 ...
- 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 ...
- JDK1.8源码(三)——java.lang.String 类
String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类. 1.String 类的定义 public final class ...
- c++ string replace_Java——String类的常用方法总结
点击上方"IT咸鱼",星标公众号重磅干货,第一时间送达 一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象. ...
- Java面试题 String类能不能被继承?为什么?
不能,因为string类是被final修饰的类,final修饰过的类不能被继承.final修饰过的变量不能被修改.
- JAVAAPI之STRING类和STRINGBUFER类
1.Stirng类的初始化 范例:String name="梁东振"; 2.String类的常见操作 -----------字符串的基本操作------------------ 范 ...
最新文章
- 团体——L1-005 考试座位号 (15 分)
- Android HttpClient post MultipartEntity - Android 上传文件
- 安装 | MatlabR2021b链接及Matlabx运行图基本运行代码与图像
- 几个有用的Linux命令
- 【计算机网络】TCP/IP 模型与OSI参考模型的比较
- i2c通信 msp430g2553_msp430g2553的IIC通信
- python免费网课-python网课资源
- FastHook——实现.dynsym段和.symtab段符号查询
- 再谈如何以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式
- (7)numpy.delete删除np数组的某一行或某一列
- ​LeetCode刷题实战317:离建筑物最近的距离
- 安卓选择市区的省市区联动
- springboot二手车交易系统毕业设计源码131456
- matlab 如何统计矩阵中大于、小于或等于某一值的位置、个数
- 运筹说 第29期 | 对偶理论与灵敏度分析—影子价格
- Mac电脑的强大压缩工具——FastZip,加密压缩。
- utl raw mysql_oracle中utl_raw
- 化纤与纺织技术杂志化纤与纺织技术杂志社化纤与纺织技术编辑部2022年第2期目录
- QT自定义简单表盘(完整代码)
- 好的软文推广都使用了哪些方法?