搜索
您的当前位置:首页正文

Jvm 加载 class 文件的原理机制与类的初始化

来源:好走旅游网

                 Jvm 加载 class 文件的原理机制


1) 装载:

    查找并加载类的二进制数据;

2)链接:

    验证: 确保被加载类的正确性;
    准备: 为类的静态变量分配内存, 并将其初始化为默认值;
    解析: 把类中的符号引用转换为直接引用;

3)初始化:

    为类的静态变量赋予正确的初始值;


准备阶段和初始化阶段看似有点矛盾, 其实是不矛盾的, 如果类中有语句: private static int a =10,

它的执行过程是这样的, 首先字节码文件被加载到内存后, 先进行链接的验证这一步骤, 验证通过后准备阶段,

给 a 分配内存, 因为变量 a 是 static 的, 所以此时 a 等于 int 类型的默认初始值 0, 即 a=0,然后到解析( 后面在说) ,

到初始化这一步骤时, 才把 a 的真正的值 10 赋给 a,此时 a=10。

 

             类的初始化


类什么时候才被初始化:


1) 创建类的实例, 也就是 new 一个对象

2) 访问某个类或接口的静态变量, 或者对该静态变量赋值

3) 调用类的静态方法

4) 反射( Class.forName("com.lyj.load"))

5) 初始化一个类的子类( 会首先初始化子类的父类)

6) JVM 启动时标明的启动类, 即文件名和类名相同的那个类

       只有这 6 中情况才会导致类的类的初始化。

类的初始化步骤:

1) 如果这个类还没有被加载和链接, 那先进行加载和链接

2) 假如这个类存在直接父类, 并且这个类还没有被初始化( 注意: 在一个类加载器中, 类只能初始化一次) ,

       那就初始化直接的父类( 不适用于接口)

3)    加入类中存在初始化语句( 如 static 变量和 static 块) , 那就依次执行这些初始化语句。
 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top