final修饰符常见三大使用情形
- 修饰类
- 修饰方法
- 修饰变量(成员变量、局部变量)
1:final修饰类
被final修饰的类,其功能和其他类一样,区别就final修饰的类是不能被其他类继承。
注:
1:fianl是不能用来修饰接口和抽象类的,否则会报错
2:final类不允许被继承(意味着该类的设计永久不需要得到改变,不需要被拓展)
3:final类中的所有成员方法都会被隐式地指定为final方法
2:final修饰方法
被final所修饰的方法,其功能和普通方法一样,只是final方法不允许被子类所重写。
注:
1:final方法要比非final方法执行速度要快,因为在编译时已经静态绑定了,不需要在运行时进行动态绑定。
2:final不能修饰构造器方法
3:private所修饰的方法会被隐式的指定为final方法
3:修饰变量
被final修饰的变量,可以当做为常量;
1:final基本类型变量:基本类型变量被final修饰之后,变量的值将永远不能改变
2:final引用类型变量:引用类型变量存储的是所指向对象的内存地址,是对象的引用,所以这里的不可变,指的是变量所指向的地址不可变,而所指向的对象实际是可以扩展的。
注:
被final所修饰的变量(成员变量,局部变量)必须显式初始化,不然是会报错的。
① 第一种方法是在声明的时候初始化(以下面例子为例)
final int a = 1;
final List<String> list = new ArrayList<>();
② 第二种方式是通过构造函数来初始化,赋予默认值。(以下面例子为例)
public class Test{
final int a;
final List<String> list;
public Test(){
this.a = 1;
this.list = new ArrayList<>();
}
}
final 修饰符的好处
- final关键字提高了性能,JVM和JAVA应用都会缓存final变量
- final关键字可以安全的在多线程环境下进行共享,而不需要额外的同步开销
- 使用final关键字,JVM会对变量,类和方法进行一些优化