final 具体使用场景

final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如 String 类就是一个final类型的类。下面就分别以锁修饰的位置:变量、方法和类分别来说一说。

2.1 变量

2.1.1 成员变量

成员变量分为

  • 类变量(static修饰的变量)
    • 声明变量时赋值
    • 静态代码块中赋值
  • 实例变量
    • 声明变量时赋值
    • 非静态初始化块中赋值
    • 构造器中赋值

image.png

2.1.2 局部变量

  • final 局部变量需要显式初始化
  • 如果 final 局部变量已经进行了初始化,后边就不能再改
  • 如果 final 局部变量未进行初始化,有且仅有一次赋值,后边也不能再改

image.png

注意:当**final**修饰基本数据类型变量时,不能对基本数据类型变量重新赋值,因此基本数据类型变量不能被改变。而对于引用类型变量而言,它仅仅保存的是一个引用,**final**只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象属性是可以改变的

2.2 方法

  • 当父类方法被**final**修饰时,子类不能重写父类的方法。比如再 Object 中,getClass就是final的,就不能重写。
  • final 方法是可以被重载的。
  1. public class FinalExampleParent {
  2. public final void test() {
  3. }
  4. public final void test(String str) {
  5. }
  6. }

2.3 类

  • 当一个类被 **final** 修饰时,表明该类是不能被子类继承的
    • 原因:子类继承往往可以重写父类的方法和改变父类属性,会带来一定的安全隐患,因此,当一个类不希望被继承时就可以使用 final 修饰。

final 底层原理

你以为真的了解 final 吗