final关键字最基本的含义就是表明“这个东西不能改变”。之所以这样,可能是考虑到两方面的因素:设计或效率。
final关键字可应用在三种场合: 数据、方法以及类
1. final数据
表明某个数据是“常数”,永远不会改变。使用final定义,编译器可以直接将常数值封装到需要的计算过程里。也就是说,计算可以在编译期前执行,从而节省运行时的开销。在JAVA中,这些常数必须属于基本数据类型。并且在对这样的一个常数进行定义的时候,必须给出一个值。
而当对象句柄使用final时,必须将句柄初始化到一个具体的对象,而且永远不能将句柄指向另一个对象。然而,对象本身可以修改。
空白final
Java允许创建“空白final”。即不赋初始值,但空白final必须在实际使用前得到正确的初始化。如果将赋初始值的语句放在不同的构造器中,则final字段可以随着调用不同的构造器而获得不同的初始值。但一旦确定,值将无法改变。
final数据无法更改:
{
final int i=5;
i=6;
}
以上语句会在编译期间出错:
:cannot assign a value to final variable i=6;
final自变量
JAVA允许将自变量设成final属性。即在方法的变量列表中进行声明。这样意味着在一个方法内部,不能改变自变量句柄所指向的东西。
2. final 方法
将一个方法标识为final,则可防止任何继承类改变这个方法的本来含义。即不可被覆盖或改写。
同时将一个方法设置成final后,编译器可以把对那个方法的所有调用都嵌入到调用里,即采用常规的代码插入方法。因此可以提高程序效率。当然,如果方法体积太大,那么程序就会变的臃肿。
因此,通常只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设置为final 。
类中所有的private方法都自动成为final。因为我们不能从类外访问final方法,所以它绝对不会被其他方法覆盖。
3. final类
若在整个类定义前冠以final关键字,表明不希望从这个类继承。而final类的数据成员既可以是final的,也可以不是。因为final类禁止了继承,所以final类中的所有方法都默认为final。因为此时不可能覆盖它们。(当然可以再为final类中的方法添加final指示符号,但这样做没有任何意义)