Java 什么情况下会触发类的初始化(类加载)

以下触发类的初始化:

  1. 遇到new,getstatic,putstatic,invokestatic这4条指令;
  2. 用java.lang.reflect包的方法对类进行反射调用;
  3. 初始化一个类的时候,如果发现其父类没有进行过初始化,则先初始化其父类(如果父类是接口,则不要求初始化父类);
  4. 当虚拟机启动时,用户需指定一个要执行的主类(包含main方法的那个类),虚拟机会先初始化这个主类;
  5. 当使用jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则先触发其类初始化;

以下不会触发类的初始化:

  1. 子类引用父类的静态字段,不会导致子类初始化。至于是否会触发子类的加载和验证,取决于虚拟机的具体实现;
  2. 通过数组定义来引用类,也不会触发类的初始化;如:People[] ps = new People[100];
  3. 引用一个类的常量也不会触发类的初始化

你可能感兴趣的:(Java,java,开发语言,jvm)