在jvm规范中,类的静态变量存储在方法区,实例变量存储在堆区,也就是说static关键字才对变量的存储区域造成影响;final关键字对于变量的存储区域是没有任何影响的,用final关键字来修饰变量表明该变量一旦赋值就无法更改,并且编译器必须保证该变量在使用前被初始化赋值。
class A {
final int a = 9;
new A();
}
这段代码里,a和9就去分开的:a是这个类的一个实例变量,类会在实例化的时候将这个变量存储在堆区,无论是否有final关键字,它都是在堆区;
而9,是一个字面量,它会存放在常量池,无论你是否加上final关键字,5都会在常量池;
这段代码你可以理解为:从常量池中取出9赋给a。