final 是 Java 中一个常见关键字,表示的意思也很简单,就是“这个东西不能变”。
许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。
常数主要应用于下述两个方面:
(1) 编译期常数,它永远不会改变
(2) 在运行期初始化的一个值,不希望它发生变化
对于编译期的常数,编译器(程序)可将常数值“封装”到需要的计算过程里。也就是说,计算可在编译期间提前执行,从而节省运行时的一些开销。在 Java 中,这些形式的常数必须属于基本数据类型
( Primitives),而且要用 final 关键字进行表达。在对这样的一个常数进行定义的时候,必须给出一个值。
无论 static 还是 final 字段,都只能存储一个数据,而且不得改变。
若随同对象句柄使用 final,而不是基本数据类型,它的含义就稍微让人有点儿迷糊了。对于基本数据类型, final 会将值变成一个常数;但对于对象句柄, final 会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。 Java对此未提供任何手段,可将一个对象直接变成一个常数(但是,我们可自己编写一个类,使其中的对象具有“常数”效果)。这一限制也适用于数组,它也属于对象。
final 的用法有以下 4 种
- 修饰类
- 修饰方法
- 修饰变量
- 修饰参数
1.修饰类
/*
* 被 final 修饰的类不允许被继承,表示此类设计的很完美,不需要被修改和扩展
*/
final class Actor {
}
如果说整个类都是 final(在它的定义前冠以 final 关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样那样的原因,该类肯定不需要进行任何改变;或者出于安全方面的理由,禁止进行子类化(子类处理)。
除此以外,我们或许还考虑到执行效率的问题,并想确保涉及这个类各对象的所有行动都要尽可能地有效。