学习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证明这一点 */
}

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.