final关键字

今天面试的过程中,面试官闻到一个问题:在进行字符串连接操作的时候,为什么推荐使用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(静态)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值