< clinit >()方法
之前讨论过类加载过程的初始化。(加载–>链接–>初始化),实际上该初始化过程是指JVM的类初始化过程。由JVM生成初始化方法 < clinnt >(),执行该方法执行初始化过程。
关于< clinit >()方法:
- 1.由静态类变量显示赋值代码和静态代码块。
- 2.执行顺序从上至下。
其执行时机如之前所说(类加载发生的时机):
- 1.使用new实例化对象(数组对象不会)或者调用一个类的静态字段(static final类型的字段不会触发类加载)
- 2.使用java.lang.reflect中的方法对类进行反射调用
- 3.初始化一个子类,发现其父类未初始化,加载其父类。
- 4.main方法所在的类(public修饰的类)会在虚拟机启动时被加载。
- 5.但是用动态语言支持时,如果一个java.lang.invoke.MethodHandle实例后解析结果REF_putStatic,REF_getStatic, REF_invokeStatic的方法句柄时,当改方法句柄对应的类没有初始化时,需要初始化该类。(动态语言支持详情请查看)
< init >()方法
创建实例时会进行初始化(构造器的主要作用是进行初始化,指的便就是该过程)
关于< init >()方法:
- 1.有多少个构造器就会有多少个< init >()方法
- 2.< init >()具体执行内容包括非静态变量赋值操作,