留意:上面在准备阶段我们说是大部门,下面讲一下那大部门指的是哪些
类级别(static修饰)的编译期常量会被直接写入 .class 文件的常量池(Constant Pool)中,并在类加载的准备阶段完成赋值。编译期常量指的是 int, double 等基本类型修饰的常量,比如 int a = 1,还有String类型修饰的常量,比如 String s = "hello",虽然String类型是引用类型,这是因为jvm的字符串常量池StringTable对常量字符串的优化。(String s = new ("hello") 这个不是在准备阶段)
这里再举一个在初始化阶段赋值的,比如引用类型的 Integer n = 1,上面我们在讲编译器优化的时候讲到 Integer n = 1 编译器实际天生的代码是 Integer n = Integer.valueOf(1),这里调用到了类的静态方法,以是静态方法需要在类初始化后才可以访问
3. 初始化(Initialization)