final static与static 修饰的常量,用类名.常量名调用时候静态代码块加载有关问题

final static与static 修饰的常量,用类名.常量名调用时候静态代码块加载问题
main方法和被调用类在一个类里面,无论Student.FIANL_STATIC_STRING还是Student.STATIC_STRING 静态代码块都会被调用。
public class Student {
public final static String FIANL_STATIC_STRING = "【2】final修饰的静态常量";
public static String STATIC_STRING = "【2】静态常量";
static {
System.out.println("【1】静态代码块");
}

public static void main(String[] args) {
// final修饰的静态常量
System.out.println(Student.FIANL_STATIC_STRING);

// 静态常量
//System.out.println(Student.STATIC_STRING);
}

}


输出结果是:【1】静态代码块
                        【2】final修饰的静态常量





但如果再写一个测试类,用来调用Student.FIANL_STATIC_STRING,静态代码块就不会被执行。


public class FinalStaticTest {
// 测试时候,注释分开去掉才能看到效果
public static void main(String[] args) {
// final修饰的静态常量
System.out.println(Student.FIANL_STATIC_STRING);

                // 静态常量
// System.out.println(Student.STATIC_STRING);
}
}


输出结果是:
【2】final修饰的静态常量


java类被加载有以下几种情况。
第一:生成该类对象的时候,会加载该类及该类的所有父类;
第二:访问该类的静态成员的时候;
第三:class.forName("类名");
final修饰的都是编译时常量,如果没用调用静态代码块是不是就意味着 Student类没有被加载进去。
------解决思路----------------------
是的。

编译时常量在编译时被 inline 处理,就是说
System.out.println(Student.FIANL_STATIC_STRING);

在编译后等同于
System.out.println("【2】final修饰的静态常量");


也就跟 Student 类没什么关系了,即使 Student 类运行时不在 classpath 内也无所谓。