编译器常量与运行期常量的本质区别

196 阅读1分钟

首先,我们需要知道,当一个类在初始化时,要求其父类需要先全部初始化完成,而对于一个静态字段来说,只有直接定义了该类的字段的类才会被初始化。譬如,我们使用子类调用父类中的静态成员变量,那么这时,子类其实是不会被初始化的。 另外一个特殊的点是被final修饰的常量在被调用时,也不会对这个类进行初始化,在编译阶段这个常量就会被存放在调用这个常量的方法所在的类的常量池当中,而调用类也并没有直接引用到定义常量的类,因此即使删除了被调用类的class文件,在运行程序也不会报错。 那么什么是运行期常量呢,举个简单例子:

public static final String str= UUID.randomUUID().toString();

当一个常量值并非编译期间可以确定的,那么其值就不会被放到调用类的常量池中 这时在程序运行时,会导致主动使用这个常量所在的类,显然会导致初始化这个类,所以这两者会有区别。