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

Java里对象创建过程是怎样的_Java对象初始化流程说明

冬婷君_2491

冬婷君_2491

发布时间:2026-01-08 15:00:36

|

520人浏览过

|

来源于php中文网

原创

Java对象创建包含严格有序的类加载、静态初始化(<clinit>)和实例初始化(<init>)三阶段,任一环节跳过或顺序错乱将引发NPE、IllegalMonitorStateException等隐性问题。

java里对象创建过程是怎样的_java对象初始化流程说明

Java对象创建不是简单的一行 new 就完事——它背后有明确的、分阶段的初始化流程,且类加载、静态初始化、实例初始化三者严格有序。跳过任一环节或混淆执行顺序,就会遇到 NullPointerException、IllegalMonitorStateException(在错误时机调用 wait()/notify())、甚至静态字段未初始化就访问等隐性问题。

类加载与链接阶段发生在 new 之前

当你第一次主动使用某个类(比如执行 new MyClass()、访问其静态字段、调用静态方法),JVM 才会触发该类的加载(Loading)、验证(Verification)、准备(Preparation)和解析(Resolution)。注意:此时尚未执行任何 Java 代码。

关键点:

  • static final 基本类型常量(如 public static final int MAX = 100;)会在准备阶段直接赋值;
  • 其他静态变量(包括 static Object obj = new Object();)在准备阶段仅设默认值(null、0、false),真实初始化要等到初始化阶段(<clinit> 方法执行);
  • 如果类加载失败(如 NoClassDefFoundError 或 ClassNotFoundException),根本不会走到 new 这一步。

<clinit> 方法执行:静态初始化唯一入口

JVM 会为每个类生成一个私有静态方法 <clinit>,它由编译器自动收集所有 static 块和静态字段赋值语句组成,并按源码顺序合并。这个方法只执行一次,且由 JVM 保证线程安全(加锁)。

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

常见陷阱:

论文常用的tex格式转换为word格式,核心是能转换数学公式(非图片),表格,图表等等
论文常用的tex格式转换为word格式,核心是能转换数学公式(非图片),表格,图表等等

将 LaTeX(.tex)学术论文转换为 Word(.docx),支持可编辑的 OMML 公式、原生 Word 表格、嵌入图形、IEEE 双栏排版及参考文献

下载
  • 在 static 块中调用尚未初始化的静态字段,会得到默认值(不是编译错误!);
  • 若 <clinit> 抛出异常(如 ExceptionInInitializerError),该类将永久处于“初始化失败”状态,后续所有对该类的主动使用都会直接抛出同样的错误;
  • 父类的 <clinit> 总是先于子类执行。

<init> 方法执行:从内存分配到构造完成

当 new 指令触发后,JVM 执行以下步骤(不可跳过、不可重排):

  • 在堆上为对象分配内存(可能触发 GC,也可能使用 TLAB 加速);
  • 将内存空间初始化为零值(0/null/false),**此时所有实例字段已具备默认值**;
  • 设置对象头(Mark Word、Klass Pointer 等);
  • 执行 <init> 方法:即你写的构造器(含隐式调用父类 super());
  • 构造器内,字段显式赋值、实例初始化块({ ... })、构造器语句按源码顺序执行;
  • 父类构造器总是在子类构造器逻辑开始前完成。

典型反模式示例:

public class Parent {
    { System.out.println("Parent init block"); }
    Parent() { System.out.println("Parent ctor"); }
}

public class Child extends Parent {
    { System.out.println("Child init block"); }
    Child() { System.out.println("Child ctor"); }
}

输出必为:Parent init block → Parent ctor → Child init block → Child ctor。试图在父类构造器中调用子类被重写的方法,会访问到未初始化完毕的子类字段(值仍为默认值)。

对象创建完成 ≠ 安全发布

即使 <init> 执行完毕,对象也未必对其他线程可见。JVM 和 CPU 可能重排序(如先写引用、后写字段),导致其他线程看到“半初始化”的对象。

必须显式保证安全发布:

  • 用 final 字段(JMM 保证构造器内对其的写入对其他线程可见);
  • 将对象发布到 volatile 字段、AtomicReference 或线程安全容器中;
  • 在同步块内完成构造并发布(如工厂方法加 synchronized);
  • 避免在构造器中泄露 this(如注册监听器、启动线程、存入全局 Map)。

最容易被忽略的是:即使没有多线程,某些框架(如 Spring、Hibernate)依赖反射或字节码增强,在构造器未结束时就可能通过代理访问对象——这时字段很可能还是默认值。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

墨刀AI
墨刀AI Hot

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

WorkBuddy

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

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

DeepSeek

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2371

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

437

2026.01.26

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

302

2024.02.23

Hibernate框架介绍
Hibernate框架介绍

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

2253

2025.08.06

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

6660

2025.09.02

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

698

2025.10.14

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

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

529

2023.09.22

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

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

1678

2024.03.01

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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