final 的使用及注意事项
final 是一个可以修饰变量, 方法, 类的修饰符
final 修饰的方法不能被重写
final 修饰的类不能被继承
final 修饰的变量为一个常量
final 不能与 abstract 一起使用
注意: 当 final 修饰一个变量时要么在声明时就给该变量赋值, 要么在该类的构造函数中给该变量赋值
例如 final int i=9;// 这就是在声明时就为变量赋值
局部内部类访问局部变量时该局部变量必须被 final 修饰 (原因看使用 final 后发生的优化)
final 修饰的基本数据类型其值不可以改变
final 修饰的引用数据类型, 其指向是不可以改变的, 但其指向的对象的内容是可以改变的
使用 final 的目的:
一, 保证安全性, 例如当一个方法被 final 修饰以后它就不能被重写, 那么在它的子类中是不可以覆盖这个方法的, 所以该方法在它的子类中安全性就得到了保证
二, 高效, 在早期的 JDK 中若一个方法被 final 修饰时, 当调用该方法时是直接使用方法的代码来替换, 省去了方法出栈入栈的过程, 提高了效率, 与 C++ 中的内联函数相似, 现在的 JDK 好像提供了其他的优化方法
使用 final 后发生的一些优化:
一, final 修饰变量后, 在编译时就直接把 final 对应的常量将变量替换, 这也是局部内部类访问局部变量时, 该局部变量必须被 final 修饰的原因, 当局部变量被 final 修饰时, 局部内部类访问该变量时会将该变量写入该内部类中方法区中的常量池中, 即使该局部变量出栈以后, 该内部类依然可以找到该变量对应的值
例如 final int i=5; 在编译的时候就直接把程序中出现 i 变量的地方全部替换为 5 并存储进常量池中.
内部类知识可以参考博客中内部类的章节
来源: http://www.bubuko.com/infodetail-3004349.html