Java OOP的类加载机制与对象初始化顺序

夏杰吖_7724

夏杰吖_7724

2025-10-05

718人浏览

原创

类加载和对象初始化顺序为:先父类静态→子类静态→父类实例→父类构造→子类实例→子类构造,静态内容仅首次加载执行,实例部分每次new时执行。

java oop的类加载机制与对象初始化顺序

Java 面向对象编程中,类的加载和对象初始化顺序是理解程序执行流程的关键。很多人在实际开发中遇到静态变量、实例变量、构造函数等执行顺序混乱的问题,本质上是对 JVM 类加载机制和对象初始化过程不够清晰。下面直接说明核心逻辑。

类加载机制概述

类加载是指 JVM 将 .class 文件加载到内存,并生成对应的 java.lang.Class 对象的过程。整个过程分为三个阶段:

  • 加载(Loading):通过类的全限定名获取字节流,创建 Class 对象
  • 连接(Linking):包括验证、准备、解析三个步骤
      - 验证确保字节码安全
      - 准备阶段为类变量(static)分配内存并设置默认初始值
      - 解析将符号引用转为直接引用
  • 初始化(Initialization):执行类构造器 () 方法,真正给 static 变量赋值或执行 static 块

类加载由 JVM 触发,常见触发点是首次主动使用该类,比如创建实例、访问其静态成员、反射调用等。

对象初始化顺序详解

当通过 new 创建一个对象时,JVM 会按照固定顺序完成初始化。这个顺序不依赖代码位置,而是遵循 JVM 规范。以继承结构为例:

假设有一个父类 Parent 和子类 Child,包含静态块、实例块、构造函数、成员变量等元素。

对象创建时的执行顺序如下:

  1. 父类的静态变量和静态代码块(按代码顺序执行)
  2. 子类的静态变量和静态代码块(按代码顺序执行)
  3. 父类的实例变量和实例代码块(按代码顺序执行)
  4. 父类构造函数
  5. 子类的实例变量和实例代码块(按代码顺序执行)
  6. 子类构造函数

注意:静态内容只在类第一次加载时执行一次;每次 new 对象都会完整执行从实例块到构造函数的流程。

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载

典型示例分析

看一段代码帮助理解:

class Parent {
    static { System.out.println("1. 父类静态块"); }
    { System.out.println("3. 父类实例块"); }
    public Parent() { System.out.println("4. 父类构造"); }
}
<p>class Child extends Parent {
static { System.out.println("2. 子类静态块"); }
{ System.out.println("5. 子类实例块"); }
public Child() { System.out.println("6. 子类构造"); }
}</p>

执行 new Child() 输出结果为:

1. 父类静态块 2. 子类静态块 3. 父类实例块 4. 父类构造 5. 子类实例块 6. 子类构造

第一次 new Child 会触发类加载和初始化,所以静态块先执行且仅执行一次。后续再 new 多个 Child 实例,则只重复执行实例块和构造函数部分。

关键细节提醒

几个容易忽略但重要的点:

  • 静态变量的赋值和静态块的执行顺序,取决于它们在源码中的先后位置
  • 实例变量的初始化语句会被放到实例块中,在构造函数调用前执行
  • 即使没有显式写静态块或实例块,编译器也会把 static 变量赋值放入 ,普通成员变量赋值放入
  • final static 常量如果能在编译期确定,会被直接内联,不参与运行时初始化

基本上就这些。掌握类加载和初始化顺序,能避免很多“为什么变量没按预期赋值”的问题。不复杂但容易忽略细节,建议结合调试断点观察执行流。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.10.24

6264

49

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.05

7235

14

java面向对象
java面向对象

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

2025.11.27

362

13

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

2026.04.09

384

30

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

2026.04.17

243

15

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

4336

7

python中class的含义
python中class的含义

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

2025.12.06

306

9

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习