final 关键字详解

final关键字在Java中有三种主要用法,分别用于修饰变量、方法和类。以下是对final关键字的详解。

基本使用场景

修饰变量

  1. final变量一旦初始化之后,值就不能再改变。

  2. 可以是成员变量,也可以是局部变量。对于成员变量:

    • 必须在声明时或者在构造函数中赋值。

    • 对于局部变量,必须在声明时或者在代码块中赋值。

final 修饰引用的时候,引用的值初始化后就不可变了,但是引用的内容可以变化

修饰方法

  1. final方法不能被子类重写,但可以被继承。

  2. 使用final关键字修饰的方法通常是设计用来实现类的核心功能,目的时:

    • 为了防止不安全的修改

    • 提高效率final方法在编译时会被内联(JVM优化),提高执行效率。

修饰类

  1. final类不能被继承。

  2. 使用final关键字修饰的类通常是设计用来防止继承修改的类,常用于工具类或基础类库。

其他特定使用场景

  1. 匿名类

在匿名内部类中使用的局部变量必须是final或“事实上的final”(即虽然未声明为final但在作用域内没有改变)。

  1. Lambda表达式内部

在Lambda表达式中使用的局部变量也必须是final或“事实上的final”(Java8 以后)。

  1. 枚举类型

所有的枚举常量都是隐式final,枚举类型也隐式final

最佳实践

  1. 常量定义:对于常量,使用public static final修饰符来确保其值不可改变。
  2. 防止对象被修改:对于类中的引用类型变量,使用final关键字确保引用不被改变,从而增强代码的安全性和可维护性。
  3. 不可变类:创建不可变类时,类本身应是final,并且所有字段都应是final

常见误区

  1. final不是不可变final关键字修饰引用类型时,引用不可变,但引用对象内容可变。
  2. final不是线程安全final变量不保证线程安全性,引用对象的内容修改仍需考虑线程同步。
  3. final提高效率:虽然final方法有内联优化,但并不是所有情况都能提高效率,具体情况需视JVM优化策略而定。