0

0

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

P粉602998670

P粉602998670

发布时间:2026-02-06 11:49:02

|

330人浏览过

|

来源于php中文网

原创

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

在java里什么是类加载顺序_java类加载流程解析

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

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

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

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

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

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

  • 遇到 newgetstaticputstaticinvokestatic 字节码指令,且对应类未初始化
  • 使用 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 在 准备 阶段直接把常量值塞进调用方的常量池,根本不会走到 初始化 阶段去读原类。

TWT Chat
TWT Chat

TWT平台推出的智能客服聊天系统

下载

立即学习Java免费学习笔记(深入)”;

  • 前提是:字段是基本类型或 String,且用字面量或编译期可确定的表达式初始化,如 static final int PORT = 8080;
  • 若写成 static final int PORT = Integer.valueOf(8080);static final String NAME = System.getProperty("name");,则仍会触发初始化
  • 这个优化让常量访问零开销,但也意味着:如果通过反射修改该类的静态 final 字段(需先 setAccessible(true)),实际生效的是运行时值,但调用方看到的仍是编译期内联的老值

最容易被忽略的一点是:类加载的“五阶段”只是逻辑划分,真实执行中各阶段高度交叉——比如 解析 可能延迟到首次方法调用时才做(支持多态),而 验证 可能在加载过程中就部分执行。别死记流程图,要盯住“什么时机真正改变运行状态”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

585

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1510

2023.10.24

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.11.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

585

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

550

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

153

2025.08.29

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

21

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.7万人学习

Java 教程
Java 教程

共578课时 | 58.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号