三、准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。需要强调的是:首先是这时候进行内存分配的仅包括类变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配是Java堆中。其次是这里所说的初始值“通常情况“下是数据类型的零值,假设一个类变量定义为:
public static int value = 123;
那么变量value在准备阶段过后的初始值是0而不是123,因为这时候尚未开始执行任何Java方法,而把value赋值为123的putstatic指令是在程序被编译后,存放于类构造器”<clinit>“方法中的,所以把value赋值为123的动作将在初始化阶段才会被执行。
上面提到的”通常情况“下初始值为零值,但是,如果类字段的字段属性表中存在ConstantValue属性,那在准备阶段变量value就会初始初始化为ConstantValue属性所指定的值,假设上面类变量value被定义为:
public static final int value = 123;
编译时Javac将会为value生成ConstantValue属性表,在准备阶段虚拟会就会根据ConstantValue的设置将value赋值为123。