一般来说,使用final关键字的理由一般有两种:设计或效率。final关键字表示“不可改变的事物”,但根据使用的位置却又有细微的区别。
final数据
对于基本类型,final使其数值恒定不变。对于对象引用,final使引用恒定不变,然而对象其自身是可以修改的。这一限制同样适用于数组。
编译期常量: 必需是基本数据类型,以final关键字修饰,在定义时必须对其进行赋值。编译器可以将该常量值代入任何可能用到它的计算式中,达到在编译时执行计算式,以此减轻一些运行时的负担。
空白final: 指声明为final但又未给定初值的域。final修饰的域必须在定义处或每个构造器 (如果有多个构造器的话)
final方法
final修饰方法原因有二,一是为了把方法锁定,以防任何继承类修改它的含义。二是为了效率,编译器会将final方法的所有调用都转为内嵌调用,消除方法调用的开销。当然,如果一个方法很大,你的程序代码就会膨胀,因而可能看不到内嵌带来的任何性能提升。
事实上最近的虚拟机(特别是hostpot技术)可以探测到这些情况,并优化去掉这些效率反而降低的额外的内嵌调用,因此不再需要使用final方法来进行优化了。
**final与private:**类中的所有private方法都隐式地指定为是final的
final类
final类表明对该类的设计永不需要做任何改动,或者出于安全考虑,不希望它有子类。也就是说final类无法被继承。因此,final类中的所有方法都隐式地指定为是final的。