java的类加载机制

1、类的加载、连接、与初始化

                      

  • 加载:在硬盘上查找,并加载累的二进制数据进内存

类加载是指将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据。

  • 连接

-验证:确保被加载类的正确性

-准备:为类的静态变量分配内存,并将其初始化为默认值

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

  • 初始化:为类的静态变量赋正确的初始值、  

类的初始化时机:

  • 主动使用:
    • 创建类的实例
    • 访问某个类的活接口的金泰变量,或者对静态变量赋值
    • 调用类的静态方法
    • 反射,如:class.forName()
    • 初始化一个类的子类
    • java虚拟机启动时被标明为启动类的类
  • 初始化步骤  
    • 加入这个类还没有被加载和连接,那就先进行加载和连接
    • 假如类存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类
    • 假如勒种存在初始化语句,那就一次执行这些语句(从上到下,如static{}
  • 除了上述六种情况,其他使用Java类的方式都看看做是被动使用,不会导致类的初始化
  • 当java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。
    •   在初始化一个类时,并不会先初始化他所实现的接口。
    •   在初始化一个接口时,并不会先初始化它的父接口。

           因此,一个负借口并不会以为它的子接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。

附文:http://hxraid.iteye.com/blog/747625

 

原文地址:https://www.cnblogs.com/zhangyfr/p/6707407.html