类的加载,连接和初始化

来源:互联网 发布:ubuntu 打字 编辑:程序博客网 时间:2024/05/29 13:51

类的加载,连接和初始化:

当程序主动使用某个类时,该类还没被加载到内存中,则系统会通过加装累加,初始化这三个步骤对该类进行初始化。这三个步骤一般都被称为类加载或者类初始化。指的是将类的class文件读入内存中,并为之创建一个java.lang.Class对象。

类的加载:

类的加载由类加载器完成,一般由jvm提供的类加载器,称为系统类加载器。开发中也可以通过继承ClassLoader基类来创建自己的类加载器。类加载器大致有以下几个加载来源:

  1. 本地文件系统加装class文件。
  2. 从JAR包加载class文件
  3. 通过网络加载文件
  4. 把一个java文件动态编译,并执行加载。

类的连接:

连接阶段负责把类的二进制数据合并到JRE中。
分为三个阶段:

  • 验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致。
  • 准备:负责为类的类变量分配内存,设置初始值。
  • 解析:将类的二进制数据中的符号替换成直接引用。

类的初始化:

在这一阶段,虚拟机对类进行初始化,主要是对类变量进行初始化。
JVM初始化一个类一般包括如下几个步骤:

  1. 假如这个类还没被加装和连接,则程序先加载并连接该类。
  2. 假如该类的直接父类没有被初始化,则先初始化父类。
  3. 假如类中有初始化语句,则系统依次执行这些初始化语句。

类初始化的时机:

  1. 创建类的实例
  2. 调用类的类方法
  3. 访问某个类或者接口的类变量,或者为该变量赋值。
  4. 使用反射机制来强制创建某个类或接口对应的java.lang.Class对象
  5. 初始化某个类的子类
  6. 使用java.exe来运行某个主类。

另外:对于一个final修饰的类变量,如果该类变量的值在编译的时就可以确定下来,那么这个类变量相当于“宏变量”,java编译器在编译时会直接帮这个类变量出现的地方替换成它的值,不会导致类初始化。如果不能在编译时候确定下来,则会导致该类被初始化。