Java类加载机制--类加载过程(准备)

Java虚拟机加载类的全过程包括:加载、验证、准备、解析、初始化。验证、准备、解析叫连接过程。今天我们讲准备。

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区内进行分配。这个阶段中有两个容易产生混淆的概念需要强调一下。首先,这时候仅对类变量(被static修饰的变量),进行内存分配。不会对实例变量进行分配,实例变量将在对象实例化时随着对象一起被分配在java堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量定义为:

public static int value = 456;

那么value在准备阶段过后的初始值是0,不是456。因为这个时候未开始执行任何java方法,而把value赋值的putstatic指令是程序被编译后,存放于类构造器()方法中,所以把value赋值的动作将在初始化阶段执行。

上面提到了“通常情况”下是零值,那么相对而言肯定有“特殊情况”下是非零值:如类字段的字段属性表中存在ConstantValue属性,那在准备阶段变量value就会被初始化为ConstantValue属性所指定的值,假设上面的value被定义为:

public static final int value =456;

那么编译时javac将会为value生成ConstantValue属性,在准备阶段就将value赋值为456.

猜你喜欢

转载自blog.csdn.net/huqianlei/article/details/90739024