Java中的final关键字有哪些用法?它与JVM的关系是什么?代码举例讲解

final关键字在Java中有三个主要用法:

  1. final修饰类:表示该类不能被继承。
  2. final修饰方法:表示该方法不能被重写。
  3. final修饰变量:表示该变量的值不能被修改。

final关键字与JVM的关系:

  1. final修饰的变量会被重载到常量池中,当调用final变量时会直接从常量池中获取值,效率较高。
  2. 方法区会分配一个元数据存储空间存储final变量和未被实例化的static变量。
  3. final修饰的变量会被强制要求在定义处或者构造器中初始化,否则会编译错误。这是因为JVM要确定final变量的值以便放入常量池。
  4. 由于final变量值固定,JIT编译器可以对调用final变量的程序片段进行内联优化,提高运行效率。

来看一个简单例子:

public final class FinalExample {
    public final void method() {
        // ...
    }

    final int VAR = 10; 
    static final String MESSAGE = "Hello";
}

public class Test {
    public static void main(String[] args) {
        System.out.println(FinalExample.MESSAGE);

        FinalExample example = new FinalExample();
        example.method();

        // example.VAR = 20; //编译错误,final变量值不能被修改
    }
} 

我们可以看到,final类不能被继承,final方法不能被重写,final变量值不能被修改。调用final变量时,值直接从常量池中获取。