final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。申明为final的常量不能再次赋值,一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。下面来一一介绍:
1. final变量
final变量是只读的,再次赋值会报错,final变量就是常量,而且通常常量名要大写。
它必须在构造器中初始化,或者调用this()初始化,否则编译器会报错“final变量(变量名)需要进行初始化”。
1 public static final String PATH= "C:\file"; 2 PATH= new String("C:\file") //JVM会报错,invalid compilation error
有一种情况需要注意,当变量申明是符合数据类型时,变量将自动默认为final变量,如下代码会报错。
public class Test{
public Byte b = 10;
public void test(Byte b){
b = 19; //JVM会报错,invalid compilation error
}
}
2. final方法
代表这个方法不可以被子类的方法重写。如果一个方法的功能已经足够完整了,以后不用更改,可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定
1 class Test1{ 2 public final String getValue(){ 3 return "abc"; 4 } 5 } 6 7 class Test2 extends Test1{ 8 @Override 9 public final String getValue(){ 10 return "def"; //compilation error: overridden method is final 11 } 12 }
3. final类
final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。
1 final class Test1{ 2 public final String getValue(){ 3 return "abc"; 4 } 5 } 6 7 class Test2 extends Test1{//compilation error: cannot inherit from final class 8 @Override 9 public final String getValue(){ 10 return "def"; //compilation error: overridden method is final 11 } 12 }
4. 一种特殊的final对象,对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容
1 private final List test= new ArrayList(); 2 test.add(“a”); //valid 3 test.add("b"); //valid 4 test= new Vector(); //not valid