关于类初始化的一个诡异问题

圣思园张龙老师关于类加载器的一个例子。

关于类初始化的一个诡异问题_第1张图片

这个打印的是1,1

关于类初始化的一个诡异问题_第2张图片

这个打印的是1,0

 

造成以上的区别的原因就在于:类加载的时候先准备(静态变量赋默认值),然后初始化(赋值或者静态代码块),实例化。

 

类的初始化只有在以下六种情况(主动使用)才会发生:

  1. 创建类的实例,并且不影响子类的初始化
  2. 访问某个类或者接口的静态变量或者赋值
  3. 访问类的静态方法
  4. 反射,比如Class.forName("xxxxxxxxxxxxx")
  5. 初始化一个类的子类
  6. 启动类

类的主动使用:只有访问当前类或者接口的静态变量或者方法时,才认为是主动使用。

你可能感兴趣的:(Java深入,新特性,classloader,jvm)