类加载时机与初始化时机的6种场景
引言 为什么要学习这个主题? 在前面的文章中,我们学习了类加载的完整流程和自定义类加载器。但你是否想过: 类什么时候被加载?什么时候被初始化? 为什么有时候静态代码块会执行,有时候不会? ClassName.class会触发类初始化吗? 理解类的加载和初始化时机,能帮助我们: 优化程序启动速度(延迟加载) 避免循环依赖问题 正确使用单例模式 理解静态代码块的执行时机 你将学到什么? ✅ 类加载的时机(何时加载) ✅ 类初始化的6种主动引用场景 ✅ 被动引用不会触发初始化 ✅ 接口的初始化规则 ✅ 类初始化的常见陷阱 ✅ 如何控制类的加载时机 一、类加载的时机 1.1 何时加载类? JVM规范没有强制规定类的加载时机,由JVM实现自行决定。 通常在以下情况加载: 第一次主动使用类时 预加载(可选,JVM优化) 1.2 何时必须初始化? JVM规范严格规定了6种必须初始化类的场景(主动引用)。 二、6种主动引用场景(必须初始化) 场景1:使用new创建对象 代码: public class NewDemo { public static void main(String[] args) { User user = new User(); // ← 触发User类初始化 } } class User { static { System.out.println("User类初始化"); } } 输出: User类初始化 说明: new关键字会触发类的初始化 执行静态代码块 执行静态变量赋值 场景2:访问类的静态字段(除final常量) 代码: public class StaticFieldDemo { public static void main(String[] args) { System.out.println(Config.name); // ← 触发Config类初始化 } } class Config { static { System.out.println("Config类初始化"); } public static String name = "Alice"; } 输出: ...