简单的java虚拟机类加载机制介绍

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)-->>验证(Verification)-->>准备(Preparation)-->>解析(Resolution)-->>初始化(Initialization)-->>使用(Using)-->>卸载(Unloading)7个阶段。

1.加载

  1)首先通过一个类的全限定名来获取此类的二进制字节流。

  2)其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

  3)最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。

2.验证

  验证的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

3.准备

  1)为类变量(static修饰的变量)分配内存并设置初始值,初始值为默认空值(在类初始化时才会赋值为变量定义语句中的值)。

  2)若类变量为常量(static final)且变量定义语句中赋值为字面量,则常量会被赋值为字面量,否则常量只有在类初始化时才会被赋值。

4.解析

  把类中的符号引用转换为直接引用

5.初始化

  (1)初始化的触发条件:

    1)访问类或接口的静态变量,或者对类的静态变量赋值。

    2)创建类的实例,即new一个对象 

    3)调用类的静态方法 

    4)反射(Class.forName(“java.lang.Objectt))

    5)子类被初始化

    6)指定一个类作为Java虚拟机启动时的初始化类(含有main方法的启动类)

  (2)初始化的顺序

    1)静态变量被访问或静态方法被调用情况:父类static变量定义赋值语句-->>父类的static代码块-->>子类static变量定义赋值语句-->>子类的static代码块-->>子类的静态方法

    2)子类被实例化情况:父类static变量定义赋值语句-->>父类的static代码块-->>子类static变量定义赋值语句-->>子类的static代码块-->>在子类中被调用的父类构造方法-->>子类构造方法

    3)静态变量只会被初始化一次。

写给自己的话:1.关于构造方法,当构造方法中有this()或者super()语句时,会循着语句去查找构造方法,直至没有显示的构造方法调用后再调用隐式的构造方法。

       2.当父类中没有默认构造方法时,子类显式或者隐式的调用父类默认构造器都会编译报错。

       3.static final 修饰的变量必须在变量定义语句或static代码块中赋值,否则会编译报错。

       4.static修饰的变量被调用前可以无赋值操作,因为在类加载阶段变量已被初始化空值。

  

posted @ 2018-03-18 18:45  乐摁码  阅读(89)  评论(0)    收藏  举报