🎅 引入
思考如下代码段,会打印出HungrySingleton init…吗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class ClazzLoadDemo { public static void main(String[] args) { Class<ClazzLoadDemo> clazz = ClazzLoadDemo.class; } }
class HungrySingleton { public static String name = "HuangHao"; static { System.out.println("HungrySingleton init..."); } private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() { } private static HungrySingleton getInstace() { return instance; } }
|
我们知道,当一个 类加载 时,类中代码执行的优先级为
静态域代码块 > 构造代码块 > 构造方法
静态代码优先级这么高,竟然也未被执行,或许是说,我们的HungrySingleton类根本就未被加载
📖 根源
可以触发类加载的条件有
第一次new该类的对象
该类写在了main函数中
访问了该类的静态属性,方法
🎁 解决
当我们访问该类的静态属性时,即把main函数中的代码改为
1 2 3
| public static void main(String[] args) { System.out.println(HungrySingleton.name); }
|
此时会打印出HungrySingleton init…