由于语境(应用环境)不同,final关键字的含义可能会稍微产生一些差异,但它最一般的意思就是声明** 这个东西不能改变。之所以要禁止改变,可能是考虑到两方面的因素:设计和效率**。由于这两个原因颇有些区别,所以也会造成final关键字的误用
final数据
许多程序设计语言都有自己的办法告诉编译器某个数据是常数。常数主要用于下述两个方面:
- 编译期常数,它永远不会改变
- 在运行期初始化的一个值,我们不希望它发生变化
对于编译期的常数,编译器(程序)可以将常数值封装到需要的计算过程里,也就是说,计算可在编译期间提前执行,从而节省运行时候的一些开销。在Java中,这些形式的常数必须属于基本数据类型(Primitives),而且要用final关键字去表达。在对这样的一个常数进行定义的时候,必须给出一个值。
无论static还是final字段,都只能存储一个数据,而且不得改变。
若随同对象句柄使用了final,而不是基本数据类型,它的含义就稍微让人有点儿模糊了,对于基本数据类型,final会将值变成一个常数;但对于对象句柄,final会将句柄变成一个常数。进行声明是时候,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另外一个对象。然而,对象本身是可以修改的。Java对此未提供任何手段,可将一个对象直接变成一个常数(但是,我们可以直接编写一个类,使其中的对象具有“常数”效果)。这一限制也适用于数组,它也属于对象。
网友评论