final static与static 修饰的常量,用类名.常量名调用时候静态代码块加载有关问题
final static与static 修饰的常量,用类名.常量名调用时候静态代码块加载问题
main方法和被调用类在一个类里面,无论Student.FIANL_STATIC_STRING还是Student.STATIC_STRING 静态代码块都会被调用。
输出结果是:【1】静态代码块
【2】final修饰的静态常量
但如果再写一个测试类,用来调用Student.FIANL_STATIC_STRING,静态代码块就不会被执行。
输出结果是:
【2】final修饰的静态常量
java类被加载有以下几种情况。
第一:生成该类对象的时候,会加载该类及该类的所有父类;
第二:访问该类的静态成员的时候;
第三:class.forName("类名");
final修饰的都是编译时常量,如果没用调用静态代码块是不是就意味着 Student类没有被加载进去。
------解决思路----------------------
是的。
编译时常量在编译时被 inline 处理,就是说
在编译后等同于
也就跟 Student 类没什么关系了,即使 Student 类运行时不在 classpath 内也无所谓。
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 内也无所谓。