Final
final从它的字面含义“最终的,最后的”可以理解,这个关键字代表的不可变动。
它可以用来修饰变量、参数、方法和类。
变量
当变量类型为基本类型时,指定该变量为常量,在编译期指定该变量是不可变的。对于编译期常量的这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译期就执行计算式,这减轻了一些运行时的负担。编译器会在该常量的使用处直接替换为相应的值。
当变量为对象时,指定该变量引用不会发生变化。但是对象本省是可以变化的。
变量必须在使用前进行赋值,可以是在定义的时候也可以是在构造时进行赋值。
一个即是static又是final的域只占一段不能改变的存储空间,一个不可变的类变量,所有实例都是用它,但都不可对他进行更改。该变量一定要在定义时赋值,无法通过构造器来赋值,因为static变量初始化要早于构造器的初始化。
接口中定义的变量,默认为public static final的。
参数
参数为final时,意味着无法改变参数对象。
方法
方法指定为final的,有2种情况。
一种是把方法锁定,防止该方法被override。这个是出于设计的考虑。
另外一种是提升执行效率。一个final方法,编译器在调用时使用的是内嵌调用的方式,当编译器发现一个final方法调用命令时,它会根据自己的谨慎判断,跳过插入程序代码这种正常的调用方式而执行方法内嵌调用机制(将参数压入栈,跳至方法代码处执行,然后跳回并清理栈中的参数,处理返回值),并且以方法体中的实际代码的副本来代替方法调用。这将消除方法调用的开销。等同于方法体代码直接写在调用处。但是我在实际的测试代码中,发现final方法的调用速度不是每次都比非final方法快,挺奇怪的,理论上会快但实际上确不一定。
private方法默认为是final的。
类
类为final时表明该类不可被继承,且所有方法默认为final的。例如:String类