1、将方法或类声明为final主要目的是:确保它们不会再子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。换言之,如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。
——《Java核心技术 卷I》
2、
举个例子:一个方法可能本来接受String类型并返回其大写方式
public static String uppperString(String s){ return s.toUpperCase(); }
要知道,String是几乎每个类都会使用的类,特别是作为Hashmap之类的集合的key值时候,mutable的String有非常大的风险。而且一旦发生,非常难发现。声明String为final一劳永逸。
3、
String 之所以是final的是因为 面向对象语言的特性: 类的多态,以及String被超级广泛的使用所决定的。
假设String不是final修饰,而是可以继承的。 设计一个类MyString 继承 String, 重写length(),并返回0。
在需要用到String对象的地方,使用的是MyString 对象,因为 类的多态,不会出现任何编译错误,但是后果不可想象。
在需要用到String对象的地方,使用的是MyString 对象,因为 类的多态,不会出现任何编译错误,但是后果不可想象。
4、 String和其他基本类型不同 ,他是个对象类型.既然是对象类型,如果是在静态方法下是必须调用静态方法或值的,如果是非静态的方法,就必须要实例化.
main函数是个static的.所以String要能像其他的基本类型一样直接被调用.这也是为什么在main函数下使用String类型不会报告错误的原因..
例如,你可能创建一个如下的String对象:
private static final String x = "example";
对于这个静态常量(由final关键字标识),你使用常量的每个时候都会创建一个临时的String对象。在字节代码中,编译器去掉”x”,代替它的是字符串“example”,以致每次引用”x”时VM都会进行一次哈希表查询。
相比之下,度于静态变量(非final关键字),字符串只创建一次。仅当初始化“x”时,VM才进行哈希表查询。