学习JVM原理-14.类装载时的Initialization并不总会执行
摘自《深入理解Java虚拟机》周志明著
代码里出现类名,未必就会初始化这个类.
不太严谨地说,只有你"用到"这个类时,类才会Initialize. 如果你只是点它的名,或者用的是它的父类,是不会Initialize的
直接看例子:
class Bean {public static int beanValue = 123;static{System.out.println("Bean inited");}}main(){ new Bean(); // 会打印"Bean inited" }main(){ int i = Bean.beanValue;; // 会打印"Bean inited" }main(){ Class b = Bean.class; // 不会打印"Bean inited" }class SubBean extends Bean{static {System.out.println("SubBean inited");}public static int subBeanValue = 456;}main(){ int i = SubBean.beanValue; /*打印的是"Bean inited" ,而不是"SubBean inited",因为beanVaue是属于Bean的*//*不过,SubBean仍会被装载,可以通过-XX:+TraceClassLoading证明这一点 */}