在Java中声明属性、方法和类时,可使用关键字final来修饰。final变量即为常量,只能 赋值一次;final方法不能被子类重写;final类不能被继承。
1.final成员
声明 final 字段有助于优化器作出更好的优化决定,因为如果编译器知道字段的值不会 更改,那么它能安全地在寄存器中高速缓存该值。final 字段还通过让编译器强制该字段为 只读来提供额外的安全级别。
1.1关于final成员赋值
1)在java中,普通变量可默认初始化。但是final类型的变量必须显式地初始化。
2)final 成员能且只能被初始化一次。
3)final成员必须在声明时(在final变量定义时直接给其赋值)或者在构造函数中被初 始化,而不能在其它的地方被初始化。
示例1 Bat.java
public class Bat {
final double PI = 3.14; // 在定义时赋值
final int i; // 因为要在构造函数中进行初始化,所以此处便不可再赋值
final List<Bat> list; // 因为要在构造函数中进行初始化,所以此处便不 可再赋值
Bat() {
i = 100;
list = new LinkedList<Bat>();
}
Bat(int ii, List<Bat> l) {
i = ii;
list = l;
}
public static void main(String[] args) {
Bat b = new Bat();
b.list.add(new Bat());
// b.i=25;
// b.list=new ArrayList<Bat>();
System.out.println("I=" + b.i + " List Type:" + b.list.getClass());
b = new Bat(23, new ArrayList<Bat>());
b.list.add(new Bat());
System.out.println("I=" + b.i + " List Type:" + b.list.getClass());
}
}
结果:
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
在main方法中有两行语句注释掉了,如果你去掉注释,程序便无法通过编译,这便是说, 不论是i的值或是list的类型,一旦初始化,确实无法再更改。然而b可以通过重新初始化来 指定i的值或list的类型。