在java中用到final关键字的地方有三处,Final data,Final methods,Final classes,final其本身的意义是不变的,在基于设计和效率的需要你可能希望某个东西在整个过程不变,下面结合java编程思想分别给出用这在三个地方的意义.
基本的数据类型前面加上final关键字是用来告诉编译器某块数据是固定不变的,比如
final int a1 = 5; //声明一个常量
static final int A2_VALUE = 10; //加上static关键字强调他只有一份
public static final int A3_VALUE = 20;//加上public可以被用于 package之外
这就是永远不可改变的编译器常量,编译期间就能执行某些计算,减少执行期的负担,次类常量必须是基本类型,而且必须在前面加上final关键字,同时必须给定初值。
static final int a4 = (int)(Math.random()*20);
这定义了一个在执行期初始化,而你不想改变它的一个常量。
final Value v1 = new Value();
将 final用于一个引用而不是基本的数据类型的时候,final让这个引用保持不变,表示,一个引用一旦被初始化指向某个对象,便再也无法改变而去指向另一个对象,但此时对象本身的内容是可以改变的。
在某个方法前面加上final关键字,表示这个方法被锁顶,使这个方法的行为在继承的过程中保持不变,而且无法被覆写(overridden).class中所有private方法自然而然就是fianl 方法,以为你无法取用private 方法,更不能覆写,你可以将final关键字加在 private 方法上,但是这不会有任何的意义,画蛇添足。
当把 class声明为 final的时,可能是出与类的设计上考虑,也可能是处于安全保密上考虑,或者是效率上考虑,即你不希望别的类继承这个类,无论你的class是否声明为final类型,他的数据成员该怎么用就怎么用,但是你的class是 final class 那么他的所有方法必然都是 final method。
另外,final Date的用法中,如果在final前还加了static关键字,在该变量当且仅能在声明的时候赋初值,不能在构造函数中赋,反之,如果没有static关键字,则可以在构造函数中赋初值!下面这段代码说明了这个问题
class FinalTest
{
final int value;
static final int value1 = 10;//前面加了static,只能在声明的时候初始化,不能在构造函数中赋值
public static final int value2 = 12;//因为,加了static就强调它只有一份
static final int a4 = (int)(Math.random()*20);
public FinalTest(int value)//,int value1,int value2)
{
this.value = value;
//this.value1 = 10;//value1;
//this.value2 = 12;//value2;
}
public static void main(String[] args)
{
new FinalTest(12);
}
}