类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)-->>验证(Verification)-->>准备(Preparation)-->>解析(Resolution)-->>初始化(Initialization)-->>使用(Using)-->>卸载(Unloading)7个阶段。
1.加载
1)首先通过一个类的全限定名来获取此类的二进制字节流。
2)其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。
2.验证
验证的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
3.准备
1)为类变量分配内存并设置类变量初始值(static修饰的变量)。
2)常量值会被初始为代码中的指定值,但不包括static final实例变量,static final修饰的实例变量是在类初始化时赋值。类的非常量静态变量的初始值为默认空值。
4.解析
把类中的符号引用转换为直接引用
5.初始化
(1)初始化的触发条件:
1)访问类或接口的静态变量,或者对类的静态变量赋值。
2)创建类的实例,即new一个对象
3)调用类的静态方法
4)反射(Class.forName(“java.lang.Objectt))
5)子类被初始化
6)指定一个类作为Java虚拟机启动时的初始化类(含有main方法的启动类)
(2)初始化的顺序
1)静态变量(非static final变量。包含)被访问或静态方法被调用情况:父类的代码块-->>父类的静态变量-->>子类的代码块-->>子类的静态变量-->>子类的静态方法
2)子类被实例化情况:父类的代码块-->>父类的静态变量-->>子类的代码块-->>子类的静态变量-->>父类构造方法(默认为super())-->>子类构造方法
3)静态变量只会被初始化一次。
写给自己的话:关于构造方法,当构造方法中有this()或者super()时,会一直查找至没有显示的构造方法调用后再调用隐式的构造方法。