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