运行结果:只打印输出了hello world。
如果将final去掉,则会触发MyParent2类的初始化。
分析:
常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中。本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量的类的初始化。注意,这里指的是将常量存到了MyTest2的常量池中,之后MyTest2就和MyParent2就没有任何关系了,甚至,我们可以将MyParent2的class文件删除。
当一个常量的值并非编译期间可以确定的,那么其值就不会被放到调用类的常量池中,这时在程序运行时,会导致主动使用这个常量所在的类,显然会导致MyParent3类的初始化。