类的加载机制

类的生命周期:
加载 、验证、准备、解析、初始化、使用、卸载

有且只有5中情况必须对立进行初始化(即主动引用):
使用new (创建一个对象)、getstatic(获取一个静态变量)、putstatic(设置一个静态变量)、invokestatic(调用一个静态方法)这个是个字节码指令时,如果类没有进行过初始化,则需要先触发初始化。
在初始化子类的时候,如果父类还没有进行初始化,那么需要先对父类进行初始化
有main的类,需要进行初始化
通过反射对类进行调用的时候,如果类没有初始化,则需要触发其初始化。
如果一个java.lang.invokeMethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先进行初始化。

除这5中情况外的其他引用都是 被动引用
eg 1: 通过子类调用父类的静态变量,只会触发父类的初始化
eg 2: 通过数组定义来引用类,不会触发类的初始化
SuperClass[] scs = new SuperClass[10];
eg 3: 常量(使用 final)在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。

public class ConstClass{
  public static final String HELLOWORLD="hello world";
}

public class NotInitialzation{
  public static void main(String[] args){
    System.out.println(ConstClass.HELLOWORLD);
  }
}

不会触发ConstClass的初始化。

你可能感兴趣的:(类的加载机制)