Java有许多关键字,static和final这两个是我们必须掌握的,它们有很多种用法,而且在恰当的环境下使用它们,可以提升程序运行性能,优化程序结构,现在我们先来了解下final关键字。
1. final关键字用法
final关键字可以用来修饰类,方法,变量(局部变量和成员变量) ,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内,不可以改变它的值。
1.1 修饰变量
/**
* @author Lee
* @// TODO 2018/7/19-11:08
* @description
*/
public class MapTest {
public static void main(String[] args) {
final int v1 = 1;
final int v2;
v2 = 2;
final FinalTest test = new FinalTest(1);
test.v = 4;
System.out.println("v1:" + v1 + ",v2:" + v2 + ",v:" + test.v);
}
}
class FinalTest {
int v;
public FinalTest(int v){
this.v = v;
}
}
在给v1赋初始值之后,v1的值不会再被修改。从v2可以看到,final修饰的变量可以不在声明时赋值,即可以先声明,后赋值。v是一个引用变量,当final修饰引用变量时,只是它的引用不可改变,但是引用对象的值是可以改变的。
1.2 修饰方法
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。” ————《Java编程思想》
类的private 方法会被隐式的指定为final方法。
1.3 修饰方法参数
如果变量是作为参数传入的,我们怎么保证它的值不会改变呢?这就用到了final的第二种用法,即在我们编写方法时,可以在参数前面添加final关键字,它表示在整个方法中,我们不会(实际上是不能)改变参数的值
final void output(final int f){
System.out.println(f);
}
1.4 修饰类
final修饰的类是无法被继承的,如果一个类你永远不会让它继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类
总结
- 1.final用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
- 2.用来修饰方法参数,表示在变量的生存期中它的值不能被改变;
- 3.修饰方法,表示该方法无法被重写;
- 4.修饰类,表示该类无法被继承。
上面的四种方法中,第三种和第四种方法需要谨慎使用,因为在大多数情况下,如果是仅仅为了一点设计上的考虑,我们并不需要使用final来修饰方法和类。