java 类变量(static final)在那个阶段或环节赋值
-
类加载过程
-
类变量初始化(static final)
使用static + final 修饰的字段的显示赋值的操作 ,到底在哪个阶段进行的赋值?- 情况:在链接阶段的准备环节赋值
- 情况:在初始化阶段<clinit>() 中赋值
在链接阶段的准备环节赋值的情况:
- 对于基本数据类型的字段来说,如果使用static final修饰,则显示赋值(直接赋值常量,而非调用方法)通常是在链接阶段的准备环节进行
- 对于String来说,如使用字面量的方式赋值,使用static final 修饰的话,则显示赋值通常是在链接阶段的准备环节进行
在初始化阶段<clinit>() 中赋值情况:
- 排除上述的在准备环节赋值的情况之外的情况。
public class InitialzationTest{
public static int a = 1;//在初始化阶段<clinit>() 中赋值
public static final int b = 10;//在链接阶段的准备环节赋值
public static final int f = new Random().nextInt();//在初始化阶段<clinit>() 中赋值
public static Integer c = Integer.valueOf(100);//在初始化阶段<clinit>() 中赋值
public static final Integer d = Integer.valueOf(100);//在初始化阶段<clinit>() 中赋值
public static String s2 ="helloworld2";//在初始化阶段<clinit>() 中赋值
public static final String s0 = "helloworld0";//在链接阶段的准备环节赋值
public static final String s1 = new String("helloworld1");//在初始化阶段<clinit>() 中赋值
}
结论:字段使用static + final 修饰,数据类型为基本数据类型或String类型,且显示赋值不涉及方法或构造器调用,赋值操作都是在链接阶段的准备环节进行。