Java类加载和初始化顺序

时间:2021-03-06 19:49:41

一个类(class)要被使用必须经过装载,连接,初始化这样的过程。

在装载阶段,类装载器(Bootstrap ClassLoader 或自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。

连接阶段又可以分为三个子步骤:验证、准备和解析。

验证就是要确保java类型数据格式 的正确性。

准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0 。在这个阶段,JVM可能还会为一些数据结构分配内存,目的 是提高运行程序的性能,比如说方法表。

解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候 再去解析它。

初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法

————————————

java程序初始化工作执行的顺序如下:

class Test {

   public static String str1; //静态变量

   public String str2; //变量

 static {   //静态代码块  }

  {      //普通代码块     }

    public Test() { //构造函数

    }

}

父类静态变量——>父类静态代码块——>子类静态变量——>子类静态代码块——>父类变量——>父类普通代码块——>父类构造器——>子类变量——>子类普通代码块——>子类构造器