(转自:http://www.cnblogs.com/ikuman/archive/2013/08/27/3284410.html)

最佳答案:

主要是为了“效率” 和 “安全性” 的缘故。若 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++相比,优点之一就包括这一点;
---
原因绝对不只有这么多,因为如果这些个核心的类都能被随便操作的话,那是很恐怖的,会出现好多好多未知的错误,莫名其妙的错误....

【转载】http://blog.csdn.net/fenglibing/article/details/5486449

========================================================== 踏踏实实做事,健健康康生活=========================================================

java的String类型为什么是final的更多相关文章

  1. Java中String类型细节

    Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否 ...

  2. Java中String类型详解

    这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...

  3. 【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  4. 【Java】 String类型的==使用

    public class StringDemo { public static void main(String[] args) { String s1 = "abc"; Stri ...

  5. 关于JAVA中String类型的最大长度

    前些天看到一道面试题,题目很容易理解:String的长度限制是多少? 针对这个题目,浏览了网友的回答,大概得到了3个层次的答案. 最浅的层次: 近似计算机内存大小的长度.这是作为一个程序员最浅显的回答 ...

  6. Android java传递string类型数据给C

    本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ...

  7. (JAVA)String类型的逻辑语句编译

    项目中遇到了动态配置条件触发相应事件的需求,需要根据String类型的逻辑语句,以及动态获取的数据,计算数据对应的结果,java实现.解决思路及代码实现如下,有需要的同学请自取. 一.需求提取 根据需 ...

  8. java之String类型

    一:定义 String是复杂类型,是特殊的复杂类型. 二:创建 两种创建形式: String s = "abc"; String s = new String("abc& ...

  9. Java之String类型详解

    字符串的特点 A:字符串一旦被赋值,就不能改变. 注意:这里指的是字符串的内容不能改变,而不是引用不能改变. B:字面值作为字符串对象和通过构造方法创建对象的不同 String s = new Str ...

随机推荐

  1. css-div下内容垂直居中

    1.多行行文字在固定高度的div中垂直居中,只兼容高级浏览器和移动端 .detail { width: 395px; height: 289px; display: -webkit-box; -web ...

  2. 总结:liunx常见命令集合

    没有系统学习过liunx,把工作中遇到的liunx命令集合信息如下: 1.nc传送文件 之前总是用rsync, 今天遇到了一个从阿里云服务器传送文件到我们公司的内网服务器,这就不能传了,又想用一致的文 ...

  3. Hbase压力测试

    PerformanceEvaluation是HBase自带的性能测试工具,该工具提供了顺序读写.随机读写.扫描等性能测试功能.本文简要介绍HBase PerformanceEvaluation的使用方 ...

  4. 日期的本质是double

    日期的本质是double,在多语种时用起来更方便.

  5. Python学习笔记——基础篇【第五周】——正则表达式(re)

    目录 1.简介 2.字符匹配 1.简介:就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译 ...

  6. python(序列递归)【输出原子级别元素。。。】

    晚上回去复习下原来的资料,返现Codebook中有个关于“展开一个嵌套序列”的话题. 任务说明:序列中的子项可能是序列,子序列的子项仍可能是序列,以此类推,则序列嵌套可以达到任意的深度.需要循环遍历一 ...

  7. MessageBox.Show()时MessageBoxIcon的显示

    MessageBox.Show()方法,有个参数是MessageBoxIcon,这个是通过图标来表明提示信息的类型,比如一般.警告.错误等 MessageBoxIcon是一个枚举 所有成员如图: 示例 ...

  8. 第九章 观察者模式 OBSERVER

    当对象发生改变时,应该使客户得到通知,然后,让客户查询对象的新状态. 其目的是在对象之间(目标对象和客户对象),定义了一个一对多的依赖关系,从而一个对象状态发生改变时,所有依赖这个对象的对象都能得到通 ...

  9. isset()和empty()的区别

    form表单的数据提交过来 如果用isset() if(isset($_GET)){ .....} '' '0' 0 返回 true 不够严谨 empty() '' '0' 0 显示返回false 比 ...

  10. 客户端socket调用

    import java.net.Socket; import java.io.*; import java.util.Scanner; import java.util.regex.Pattern; ...