讲师中心 微信公众号
AI工具推荐 视频效率加速

详解Java中的类构造器与实例构造器的执行时机

陌婷吖_6374

陌婷吖_6374

发布时间:2026-02-28 09:43:02

|

715人浏览过

|

来源于php中文网

原创

在类首次主动使用时执行且仅一次,包括调用静态方法、访问非编译期常量静态字段、new实例、反射获取Class、子类初始化(父类未初始化时);编译期常量不触发。

详解java中的类构造器<clinit>与实例构造器<init>的执行时机

Java类加载时<clinit></clinit>到底在什么时候跑

<clinit></clinit>是JVM自动生成的静态初始化方法,不是你写的任何函数,但它会执行所有静态变量赋值和static代码块。它只在**类首次主动使用**时触发,且仅执行一次。

常见错误现象:以为只要new一个对象就跑<clinit></clinit>,其实可能早就在引用某个静态常量时就执行过了;或者误以为子类初始化一定会触发父类<clinit></clinit>——其实父类<clinit></clinit>早已执行完毕,除非父类还没被初始化过。

关键点:

  • <clinit></clinit>执行时机包括:首次调用该类的静态方法、首次访问非编译期常量的静态字段、首次new该类实例、反射获取Class对象、子类初始化(但前提是父类尚未初始化)
  • 编译期常量(如public static final int X = 123;)不会触发<clinit></clinit>,因为它们在编译时就被内联到调用处了
  • 多个静态块和静态变量初始化按源码顺序合并进<clinit></clinit>,且JVM保证其线程安全(由类加载器加锁控制)

<init></init>和new指令的关系

每次new一个对象,JVM都会调用对应的<init></init>方法——也就是你写的构造器编译后生成的那个。但注意:<init></init>不是构造器本身,而是构造器的字节码实现,它不包含static内容,只处理实例字段和{}实例初始化块。

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

容易踩的坑:

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • 父类构造器没显式调用super()时,编译器会自动插入,但若父类没有无参构造器,编译直接失败——这不是<init></init>的问题,而是语法约束
  • 如果构造器抛异常,<init></init>执行中途退出,对象虽已分配内存,但不会被返回,也不会触发finalize或Cleaner注册
  • 匿名内部类或Lambda表达式捕获局部变量时,那些变量会被复制进新对象的字段,这部分逻辑也发生在<init></init>里

为什么<clinit></clinit>和<init></init>不能互相调用

JVM规范明确禁止在字节码层面从<clinit></clinit>跳转到<init></init>,反之亦然。这不是Java语言层的限制,而是JVM运行时的安全机制。

原因很实际:

  • <clinit></clinit>运行时,类可能还未准备好实例化(比如依赖的某些类还在加载中),此时调用<init></init>会导致死锁或NoClassDefFoundError
  • <init></init>需要this指针,而<clinit></clinit>没有this——它是类级别的,不属于任何对象
  • 试图用反射在<clinit></clinit>里newInstance(),会触发该类的<init></init>,但前提是类已完成初始化;否则先卡在自己的<clinit></clinit>里,形成循环等待

调试时怎么确认<clinit></clinit>或<init></init>是否执行了

不能靠断点(IDE通常不支持对<clinit></clinit>设断),得靠日志或字节码观察。

实操建议:

  • 在静态块和构造器第一行加System.out.println("clinit running")或System.out.println("init running"),最简单有效
  • 用javap -c YourClass查看是否生成了<clinit></clinit>(有static字段或static块才生成)和<init></init>(只要有构造器就生成)
  • 启动JVM时加-XX:+TraceClassLoading,能看到类加载和初始化时间点,配合日志可定位<clinit></clinit>触发源头

真正复杂的地方在于:类加载、链接、初始化三个阶段边界模糊,而<clinit></clinit>属于初始化阶段的唯一入口。很多人把“类加载完成”等同于“可以安全使用”,其实只要没走到<clinit></clinit>,静态资源就还没就位——这点在OSGi、热部署、模块化场景里特别要小心。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
java基础知识汇总
java基础知识汇总

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

6164

2023.10.24

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

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

6164

2023.10.24

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

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

6164

2023.10.24

string转int
string转int

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

6679

2023.08.02

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

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

3225

2024.08.29

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

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

4168

2025.08.29

C++中int的含义
C++中int的含义

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

2845

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

1051

2023.09.15

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn