final关键字在Java中有三个主要用法:
- final修饰类:表示该类不能被继承。
- final修饰方法:表示该方法不能被重写。
- final修饰变量:表示该变量的值不能被修改。
final关键字与JVM的关系:
- final修饰的变量会被重载到常量池中,当调用final变量时会直接从常量池中获取值,效率较高。
- 方法区会分配一个元数据存储空间存储final变量和未被实例化的static变量。
- final修饰的变量会被强制要求在定义处或者构造器中初始化,否则会编译错误。这是因为JVM要确定final变量的值以便放入常量池。
- 由于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变量时,值直接从常量池中获取。