final使用详解

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并存储进常量池中。

内部类知识可以参考博客中内部类的章节

原文地址:https://www.cnblogs.com/zhaolei1996/p/10623406.html