常量池,分为两种类型:Class文件的常量池和运行时常量池。前者指已编译Class文件中的一份数据。它包括了关于类,接口等中的常量和字符串常量。后者指方法区中的一块儿内存。
此处的常量池也可以理解为编译常量。而编译常量只加载类就可以使用了,但是不执行类的初始化。
在使用成员变量的时候,要区分一下当前的类是已经加载状态还是已经初始化状态。如下面的例子:
import java.util.Random;
class FinalClassA
{
public static final int x =6/3;
static
{
System.out.println("FinalClassA static block");
}
}
class FinalClassB
{
public static final int x =new Random().nextInt(100);
static
{
System.out.println("FinalClassB static block");
}
}
public class Test {
public static void main(String[] args)
{
System.out.println(FinalClassA.x);
System.out.println(FinalClassB.x);
}
}
输出结果为:
2
FinalClassB static block
0
感谢金丝燕大学校长