声明接口类型变量并初始化实现类,JVM何时加载该类?代码场景疑问
接口实现类的JVM加载时机问题
核心结论
- 接口
Vehicle在应用启动阶段被加载,是因为它作为方法内的类型声明,属于类的静态依赖,会在JsonSampleController类加载时被JVM提前解析; - 具体实现类
Car不会在应用启动时加载,只有当getUser()方法被**实际调用(运行时)**时,JVM执行到new Car()这行代码,才会触发Car类的加载、链接与初始化流程。
原因解析
JVM类加载遵循**懒加载(延迟加载)**原则,除非触发特定条件(比如类的静态代码块执行、静态变量被主动引用等),否则类不会提前加载。在你的示例场景中:
Vehicle vehicle = new Car();里的Vehicle作为局部变量的类型声明,属于类的符号引用,会在JsonSampleController类加载的解析阶段被转换为直接引用,因此Vehicle会随控制器类一同加载;- 而
new Car()是实例化代码,只有当方法真正被执行时,JVM才会去查找并加载Car类,完成后续的实例创建操作。
验证方法
你可以通过以下步骤验证结论:
- 启动应用后,调用
/v1/user接口; - 观察
-verbose:class的输出日志,此时会看到Car类被加载的记录。
内容的提问来源于stack exchange,提问作者nzomkxia
相关产品推荐
相关产品推荐

