0

0

Java中的类加载时机是什么时候_静态变量初始化与主动使用场景

P粉602998670

P粉602998670

发布时间:2026-03-17 12:32:03

|

419人浏览过

|

来源于php中文网

原创

类加载发生在第一次主动使用时,而非定义或new时;主动使用包括实例化、调用静态方法、访问非final静态字段、反射获取Class(需初始化)、子类初始化、JVM启动主类等七种情形。

java中的类加载时机是什么时候_静态变量初始化与主动使用场景

类加载发生在第一次主动使用时,不是定义时也不是new时

Java 类不会在编译完成或类文件被读入 JVM 时立刻加载。真正触发 ClassLoader.loadClass() 并执行链接、初始化的,是「主动使用」——这是 JVM 规范明确定义的行为。很多人误以为 new MyClass() 或声明变量就加载,其实不然:如果只是引用了类名但没触发任何主动行为,类可以一直不加载。

  • 主动使用包括:new 实例化、调用静态方法、访问(读或写)静态字段(final 常量除外)、反射获取 Class 对象、子类初始化导致父类初始化、JVM 启动时指定的主类
  • final static 基本类型常量(如 public static final int VAL = 42;)在编译期就内联到调用处,访问它不会触发类加载
  • 声明变量(MyClass obj;)、继承、实现接口、import,都不算主动使用

静态变量初始化只在类初始化阶段执行一次,且按代码顺序

静态变量赋值和静态代码块(static {})都在类的「初始化阶段」执行,且严格按源码中出现的顺序从上到下执行。这个阶段只发生一次,由 JVM 保证线程安全(通过类初始化锁)。

  • 如果静态变量依赖尚未初始化的其他静态字段,会得到默认值(如 int0,引用类型是 null),不是抛错
  • 静态初始化块里抛出未捕获异常,会导致 NoClassDefFoundError 后续所有对该类的主动使用
  • 子类初始化时,父类一定已完成初始化;但父类静态字段被子类继承后访问,仍只触发父类初始化(不会重复)
class Parent {
    static { System.out.println("Parent init"); }
    static int x = getValue();
    static int getValue() { return y + 1; } // 注意:此时 y 还未赋值,返回 0+1=1
    static int y = 2;
}

上面代码输出 Parent initx 最终是 1y2 —— 因为 getValue() 调用时 y 还处于默认值 0 状态。

容易踩坑:看似“用了”其实没触发类加载

很多调试场景下你以为类已经加载并初始化了,结果发现静态块没执行、静态变量还是默认值,本质是触发条件没满足。

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载

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

  • 仅通过反射获取 Class 对象(Class.forName("MyClass", false, loader))且第二个参数为 false,就不会初始化类
  • ClassLoader.getSystemClassLoader().loadClass("MyClass") 也不会触发初始化,只完成加载和链接
  • 访问 final static 字符串或基本类型字段(如 MyClass.CONST),若该字段在编译期可确定,则根本不会走到类加载流程
  • 泛型擦除后,List<MyClass> 不构成对 MyClass 的主动使用

验证类是否已加载/初始化:用 JVM 参数或运行时检查

光看代码逻辑容易误判,实际运行中需要工具辅助确认状态。

  • -verbose:class 启动 JVM,能看到每个类加载的时机和来源(注意:这不等于初始化)
  • -XX:+TraceClassInitialization 可精确打印哪些类进入了初始化阶段(JDK 8u261+ 支持)
  • 运行时用 Class.forName("MyClass", true, loader) 强制触发初始化(第二个参数 true 表示要初始化)
  • MyClass.class.desiredAssertionStatus() 这类反射调用,只要类已加载就会成功;但如果类根本没加载,会触发加载+初始化(因为 .class 字段访问属于主动使用)
类加载和初始化的边界很窄,差一个参数、一行访问、甚至一个 final 修饰符,行为就完全不同。最麻烦的是那些“看起来应该发生了,但其实没发生”的情况——这时候得回到规范查主动使用的七种情形,而不是凭经验猜。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

255

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1153

2024.03.01

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

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

1570

2023.10.24

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

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

1570

2023.10.24

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

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

1570

2023.10.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

565

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

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

精品课程

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

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

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

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