类的初始化和实例化过程

类的初始化和实例化过程

类的初始化

类初始化时机

Java虚拟机规范中有且仅有5种情况必须立即对类进行初始化。

  1. 遇到new,getStatic,publicStatic和invokeStatic这四条指令的时候,要对类立即进行初始化。生成这四条指令的java代码

    • 使用new关键字实例化对象的时候
    • 读取或者设置一个类的静态字段
    • 调用一个类的静态方法
  2. 使用java.lang.reflect包的方法对类进行反射的时候,如果类没有初始化,要对其进行初始化。

  3. 当初始化一个子类的时候,如果发现其父类没有初始化,要先对其父类进行初始化
  4. 当虚拟机启动的时候,用户需要指定一个要执行的主类
  5. 当使用JDk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果是REF_getstatic, REF_publicstatic和invokestatic的方法句柄,并且这个方法句柄没有被初始化的时候,要先对其进行初始化。

类初始化顺序