在Java里什么是类加载顺序_Java类加载流程解析-java教程

new Child() 先打印 Grandparent 静态块,因为 JVM 类初始化遵循父类优先原则:触发 Child 初始化前必须先完成 Parent 和 Grandparent 的初始化,且静态内容按源码声明顺序执行。

类加载顺序不是“代码执行顺序”,而是JVM对类结构进行初始化的严格阶段链:加载→验证→准备→解析→初始化,其中静态内容初始化(static字段和块)按源码声明顺序触发,且父类优先于子类。

为什么 new Child() 会先打印 Grandparent 静态块?

因为 JVM 触发类初始化时,必须确保其直接父类已初始化完毕——这是“父类优先原则”,由规范强制保证,与你是否显式调用无关。

  • 只要 Child 类首次被主动使用(如 new Child()、访问 Child.staticField),JVM 就检查它是否已初始化;未初始化则先触发 Parent 初始化,而 Parent 又强制先完成 Grandparent 初始化
  • 静态变量赋值和静态代码块按 Java 源码中从上到下的**文本顺序**执行,不是按声明类型(字段/块)分组
  • 准备阶段只设默认值(如 int 设为 0),真正赋值发生在 初始化 阶段——所以 static int x = 5; 的 5 是在初始化时才写入

哪些操作会真正触发类初始化?

只有六种“主动使用”场景才会强制进入初始化阶段,其他如单纯声明引用、子类引用父类静态字段(非 final)、数组创建等,都不会触发子类初始化。

  • 遇到 new、getstatic、putstatic 或 invokestatic 字节码指令,且对应类未初始化
  • 使用 java.lang.reflect 对类进行反射调用(如 Class.forName("X"),注意带参版本默认 initialize=true)
  • 初始化子类时,父类尚未初始化
  • 虚拟机启动时标明的主类(即含 main 方法的类)
  • 使用 JDK 7+ 的动态语言支持(如 invokedynamic)首次解析 MethodHandle 且对应类未初始化
  • java.lang.invoke.MethodHandle 解析结果为 REF_getStatic/REF_putStatic/REF_invokeStatic,且对应类未初始化

为什么 static final 常量不触发类初始化?

因为编译期就内联了——JVM 在 准备 阶段直接把常量值塞进调用方的常量池,根本不会走到 初始化 阶段去读原类。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里什么是类加载顺序_Java类加载流程解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001431+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001431+
  • 本周更新: 0+
  • 最后更新: 2026-03-16