今天看了ImportView翻译的一篇关于java中的final关键字的文章,特此作一下记录,与大家分享。本篇随笔简要总结final关键字的用法,好处以及相关总结。
- finla关键字可以用于声明变量,此处的变量既可以为成员变量也可以为本地变量,本地变量就是在代码块中或者方法中的变量,称为final变量。final变量通常与static一起使用, 称为常量,例如:public static final String COUNTRY = "China" . 常量即为不可变的量。此处应注意:仅用final声明的成员变量只可以在两种情况下进行初始化,或者在声明的同时进行初始化,或者在构造器中进行初始化。但是与static一起进行声明的常量则必须在声明的时候进行初始化。本地变量可以在声明的时候初始化或在方法的其他部分初始化,但只能初始化一次。
- final修饰方法,表示此方法是不能被子类重写的,但可以被同类中的同名方法重载。如果一个方法已经足够完整,子类不需要进行重写的话,则可以将此方法声明为final方法。final方法比非final方法要快,因为final方法在编译的时候已经静态绑定了,而非final方法则是运行时的动态绑定。
- final 修饰类,称为final类,表示此类是不能被继承的,它的功能通常是完整的,java中有许多final类,如果去查JDK API,可以发现String, Integer, Character, Boolean以及其他包装类都是final类。
- 使用final关键字的好处:
[1]final关键字提高了性能 ,JVM和Java应用都会缓存final变量。 [2]final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。[3] 使用final关键字,JVM会对方法、变量及类进行优化。
- final关键字相关知识点总结:
[1].final关键字可用来修饰成员变量,本地变量,方法以及类。
[2].final成员变量必须在声明的时候或者构造器中进行初始化,否则会发生编译错误,final本地变量由于不能在构造器中赋值,所以只能在声明的同时进行初始化。
[3].final变量只能赋值一次,任何对已赋值final变量进行修改的尝试都会发生编译错误。
[4].在匿名类中的所有变量是final变量。
[5].final方法不能被子类重写,final类不能被继承。
[6].接口中的所有成员变量默认都是public static final的,所有的方法都是public abstract的。
[7].final和abstract两个关键字是相互排斥的,一个类如果是final的,则肯定不是abstract类,反之亦然。
[8].final方法在编译时进行静态绑定。
[9].没有在声明时初始化的final变量称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
[10].将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
[11].对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。例如:
final List<Integer> list = new ArrayList<Integer>() ; List<Integer> list1 = new ArrayList<Integer>() ; list1.add(1) ; list1.add(2) ; list1.add(3) ; list = list1 ;//compile error,.the final local variable list cannot be assigned.
由上,我们已经知道final变量、final 方法以及final类是什么了。必要的时候使用final,能写出更快、更好的代码的。