摘自《深入理解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证明这一点 */ }