类初始化过程深入理解

整体概览

类初始化过程深入理解_第1张图片
类生命周期

类的加载

  • 类的加载的最终产品是位于内存中的Class对象
  • Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口
  • 类加载器不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时预先加载它,如果与先加载过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误
  • 如果这个类一直没被程序主动使用,那类加载器就不会报告错误

连接

  • 将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去

验证

  • 类文件的结构检查
  • 语义检查
  • 字节码验证
  • 二进制兼容性的验证

准备

  • 准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值。例如以下示例,在准备阶段将为int类型的静态变量a分配4个字节的内存空间,并且赋予默认值0,为long类型的静态变量b分配8个字节的内存空间,并且赋予默认值0.
public class Sample{
    private static int a = 1;
    public static long  b;
    static {
        b = 2;
    }
}

类的初始化

  • 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。在程序中,静态变量的初始化有两种途径:
    1. 在静态变量的声明处进行初始化
    2. 在静态代码块中进行初始化
  • Java虚拟机按照初始化语句的类文件的先后顺序依次执行它们

例如以下代码,静态变量a和b都被显式初始化,而静态变量c没有被显式初始化,它将保持默认值0,按照先后顺序a最终将取值为4

public class Sample{
    private static int a = 1;
    public static long  b;
    public static long  c;
    static {
        b = 2;
    }
    static {
        a = 4;
    }
}

你可能感兴趣的:(类初始化过程深入理解)