今天面试的过程中,面试官闻到一个问题:在进行字符串连接操作的时候,为什么推荐使用StringBuffer.append()方法,而不推荐用“+”?
参考答案: http://blog.csdn.net/u011063151/article/details/73864388 (原谅使用引用,只是觉得别人已经总结的很全面了,就不再赘述)
但是这里要将的并不是面试的问题,而是对final关键字的思考,以下内容皆来自《Thinking in Java》。
首先final关键字可以修饰:域、方法、类。
final修饰的域,在Java中称之为“常量”。所谓常量就是在程序编译和运行期间,这个域的值不会发生改变。
注意:
a、常量在声明时必须进行初始化,之后其值将不再发生变化;
b、对于基本数据类型,final会将值变成一个常数;
c、对于对象句柄(对象引用),final会将句柄变成一个常数,在声明时必须将句柄初始化到一个具体的对象,而且永远不能将句柄变成指向另一个对象。然而对象本身是可以修改的。
Java对此未提供任何手段,可以将一个对象变成一个常数(但是可以通过编写一个类,来使其中的对象具有“常数”效果,这也正是String类的做法)。
通过观察源码可以发现:String、StringBuilder、StringBuffer类均是被final标识,但只有String类的对象为常量(不可变),而后两者确实变量。这是因为String类的底层所维护的字符数组也是被final修饰的,而后两者底层所维护的字符数组皆继承自它们的共同父类AbstractString中定义的字符数组,该字符数组没有用final修饰。故而在字符串的连接操作性能方面会呈现这样的结果:StringBuilder > StringBuffer > String。
final修饰的方法,是为了保护已有的方法不被其子类重写,两个目的:上锁、提升性能。(具体请参考《Thinking in Java》)。
final修饰的类,表示该类为终结类,即该类不允许有子类。这种情况在Java的官方API中体现很多。这样做的目的可能是为了保证程序的效率或者安全性。
final注意事项:
在设计类是,一定要慎重考虑其将来的变化,这样才能准确的使用final关键字。
补充:在说到final关键字的时候,我们有时候还会关注另一个关键字:static(静态)