final的作用
- 在早期使用final,会将final方法转为内嵌调用,
- 内嵌调用:用一个方法去调用另一个方法,当编译器发现方法是final的,它会把另外方法的内容全部挪过来,相当于是在同一个方法中执行,而不进行方法的调用。
- 因为方法直接的调用会有一定的性能损耗,所以可以提高程序运行的效率
- 现在:
- 类防止被继承、方法防止被重写、变量防止被修改
- 天生是线程安全的,而不需要额外的同步开销
- 现在的JVM会尽量优化代码的编译,因此早期带来的性能提升在现在是可以忽略的
final修饰变量
属性被声明为final以后,该变量只能被赋值一次。且一旦被赋值以后,final的变量值就不能再改变。
赋值时机不同:
- 类中的final属性
- 第一种是在声明变量的等号右边直接赋值
- 第二种是在构造函数中赋值
- 第三种是在类的初始化代码块中赋值
- 必须要选择赋值的时机,而不能不赋值,这是final语法规定的
- 类中的static final 属性
- 在声明变量的等号右边可以直接赋值
- 用static初始化代码块里赋值,不能在普通初始代码块中赋值
- 必须要赋值
- 方法中的final变量
- 不规定赋值时机,但是要求在使用之前必须赋值
- 如果不被使用,就可以不赋值
final修饰方法
- 构造方法不允许final修饰
- 不可以被重写
final修饰类
- 不可以被继承
- 例如 String类