<clinit>方法的执行时期:类初始化阶段
<clinit>方法的内容:多有的类变量初始化语句和类型的静态初始化器
类的初始化的时机:在java代码中首次主动使用的时候,
1、创建某个类的新实例的时候,
2、调用某个类的静态方法时
3、使用某个类或者接口的静态字段或者对改字段(final 字段除外)赋值的时候
4、调用java的某些反射方法的时候
5、初始化某个类的子类的时候
6、在虚拟机启动的时候某个含有main()方法的那个启动类
不会有<client>方法的情况
1、各类没有申明任何的类变量,也没有静态初始化语句
2、该类声明了类变量,但没有明确使用类变量的初始化语句或者静态初始化语句的初始化
3、该类仅仅包干final修饰的类变量初始化语句,并且类变量初始化语句是便是时常量表达式
<init>方法:
执行时期:对象的初始化阶段
实例化一个类的途径:
1、调用new操作符
2、调用Class
或 java.lang.reflect.Constructor
对象的newInstance()
方法
3、调用任何现有方法的clone方法
4、通过 java.io.ObjectInputStream
类的 getObject()
方法反序列化
类加载:
类加载的时机:
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的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,组需要先触发其初始化
对于静态字段,只有直接定义这个字段的类才会被初始化,因此通子类来引用父类中定义的静态字段,只会出发父类的初始化,而不会触发子类的初始化。
卸载