最佳答案:主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高频使用,可能会降低程序的性能,所以String被定义成final。
① String是对象类型。由于对象类型在静态方法下必须调用静态方法或值,在非静态方法下必须要实例化。main函数被static修饰。将String定义成final,这也是:String是对象类型,在main函数下无需实例化,能像其他的基本类型一样直接被调用而不会报错误的原因。
② 当String类型被static和final修饰加快程序速度。这一点,对于原始数据类型,也成立。
例如: private static final String x = "example";
对于这个静态常量(由final关键字标识),当使用常量时每次都会创建一个临时的String对象,在字节码中,编译器将字符串“example”替代“x”,以至每次引用“x”时,JVM都会进行一次哈希表查询。 相比之下,对于静态变量(非final关键字),字符串只创建一次。仅当初始化“x”时,VM才进行哈希表查询。
③ 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如:java.lang.String中,为String类指定final,可以防止了程序员覆盖length()方法。
④ 若指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
示例:
如果String 不是final 那么就可以继承
public class String2 extends String{
// ..
}
那我们的 main也就可以写成
public class Test {
public static void main(String2[] args) { // 注意此处
//
}
}
补充一点:final的类不能被继承,不能让其他类继承,意义就在于:安全性。
Java自出生那天起就是“为人民服务”,这也就是为什么Java做不了病毒,也不一定非得是病毒,反正总之就是为了安全,人家Java的开发者目的就是不想让Java干这类危险的事儿,Java并不是操作系统本地语言,换句话说Java必须借助操作系统本身的力量才能做事,JDK中提供的好多核心类比如String,这类的类的内部好多方法的实现都不是Java编程语言本身编写的,好多方法都是调用的操作系统本地的API,这就是著名的“本地方法调用”,也只有这样才能做事,这种类是非常底层的,和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的,这不就成了核心病毒了么?
那么不希望别人改,这个类就像一个工具一样,类的提供者给我们提供了,就希望我们直接用就完了,不想让我们随便能改,其实说白了还是安全性,如果随便能改了,那么Java编写的程序肯定就很不稳定,你可以保证自己不乱改,但是将来一个项目好多人来做,管不了别人,再说有时候万一疏忽了呢?他也不是估计的,所以这个安全性是很重要的,Java和C++相比,优点之一就包括这一点。