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

请问这里面有没有深层次原因?
[b]问题补充:[/b]
谢谢nickevin的回答,不过我还是看的不大明白。
可以看一下String类的定义:
public [b]final [/b]class String
implements java.io.Serializable, Comparable, CharSequence{
......

我想知道的是为什么在类定义上加了final关键字,除去可能带来的性能提升外,还有其他原因么?

你看一下代码 很简单

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) { // 注意此处
//

}
}

所以我认为 一切的源头来自main方法的初始化

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%。

你参考一下这个 官方论坛的回答
http://forums.sun.com/thread.jspa?threadID=636414