Java 中 final 关键字的作用是什么?(超详细)

更新时间 2023-03-23 22:43:11

在 Java 中,final 关键字可以用于修饰变量、方法和类。它的作用有以下几个方面:

  1. 变量被声明为 final 后,该变量的值不能被修改。 也就是说,它是一个常量。如果试图对一个 final 变量重新赋值,会导致编译错误。例如:

    final int a = 10;
    // a = 20; // 编译错误:无法为最终变量 a 分配值
    
  2. 方法被声明为 final 后,该方法不能被子类重写。 也就是说,它是一个不可变的方法。如果子类试图重写一个 final 方法,会导致编译错误。例如:

    public class Parent {
        public final void print() {
            System.out.println("Hello, World!");
        }
    }
    
    public class Child extends Parent {
        // @Override // 编译错误:print() in Child cannot override print() in Parent
        public void print() {
            System.out.println("Hello, Java!");
        }
    }
    
  3. 类被声明为 final 后,该类不能被继承。 也就是说,它是一个不可继承的类。如果试图从一个 final 类派生出子类,会导致编译错误。例如:

    final public class FinalClass {
        // ...
    }
    
    // public class ChildClass extends FinalClass {} // 编译错误:无法从最终 FinalClass 进行继承
    
  4. final关键字还可以用于实现安全发布和线程安全。

在 Java 中,对象的创建和初始化过程可能会受到指令重排序等因素的影响,导致对象的状态无法正确发布。使用 final 关键字可以解决这个问题,因为在对象的构造方法中对 final 变量的写入操作会在对象的构造方法完成之前完成。因此,将一个对象的引用声明为 final,可以保证该对象被正确地发布出去。

另外,final关键字还可以用于实现线程安全。如果将一个变量声明为 final,则多个线程之间共享该变量时,不需要进行同步,因为该变量的值不可修改。

总结

总之,final 关键字可以用于实现不可变性、不可变方法、不可继承类、安全发布和线程安全等功能。