static final的初始化与赋值问题

时间:2024-03-30 10:11:00

1.Class 文件的生成阶段

Sun javac编译器对于静态field字段的初始化赋值策略
目前的Sun javac编译器的选择是:
1.如果使用final和static同时修饰一个field字段,并且这个字段是基本类型或者String类型的,那么编译器在编译这个字段的时候,会在对应的field_info结构体中增加一个ConstantValue类型的结构体在赋值的时候使用这个ConstantValue进行赋值
2.如果该field字段并没有被final修饰,或者不是基本类型或者String类型,那么将在类构造方法cinit>()中赋值。

对于上述的public static final init MAX=100; javac编译器在编译此field字段构建field_info结构体时,除了访问标志、名称索引、描述符索引外,会增加一个ConstantValue类型的属性表。

static final的初始化与赋值问题
图片转载:https://img-blog.csdn.net/20141113154008360来源

2.类加载阶段(链接(准备阶段))

如果类字段的字段属性表中存在ConstantValue属性,即同时被final和static修饰,那么在准备阶段变量value就会被初始化为ConstValue属性所指定的值。 假设上面的类变量value被定义为: public static final int value = 3; 编译时Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为3。
顺便讲一句:static final 与final static 只是使用的习惯问题 ,没有 差别