类加载与初始化机制

核心逻辑(适用于大多数OOP语言)​

执行顺序铁律:​
父类静态 → 子类静态 → 父类实例 → 子类实例

(静态数据只初始化一次,实例数据每次new都执行)


📊 通用执行顺序流程图

css 复制代码
mermaid
graph TD
    A[父类静态成员初始化] --> B[子类静态成员初始化]
    B --> C[父类实例成员初始化]
    C --> D[父类构造函数]
    D --> E[子类实例成员初始化]
    E --> F[子类构造函数]

🛠️ 关键概念解析

1. 静态 vs 非静态

特性 静态成员 非静态成员
初始化时机 类加载时(仅一次) 每次实例化时
内存分配 全局唯一 每个实例独立一份
访问方式 类名.成员 实例.成员

2. 类加载阶段(语言无关)​

  1. 加载 :读取类定义(如.class/.dll文件)
  2. 验证:检查语法/安全性
  3. 准备:为静态变量分配内存(赋默认值)
  4. 解析:处理符号引用
  5. 初始化:执行静态代码和静态变量赋值

3. 实例化阶段

  1. 分配实例内存
  2. 初始化实例变量
  3. 执行构造函数

🌰 伪代码示例

场景:父类与子类初始化

scala 复制代码
plaintext
class Parent:
    static:
        print("父类静态初始化")
    
    instance:
        print("父类实例初始化")
    
    constructor():
        print("父类构造函数")

class Child extends Parent:
    static:
        print("子类静态初始化")
    
    instance:
        print("子类实例初始化")
    
    constructor():
        print("子类构造函数")

// 测试
obj = new Child()

输出结果

复制代码
markdown
父类静态初始化
子类静态初始化
父类实例初始化
父类构造函数
子类实例初始化
子类构造函数
  1. 默认值优先

    所有静态变量会先赋默认值(如int=0),再执行显式赋值:

    ini 复制代码
    java
    static int a = 5;
    static { a = 10; }
    // 最终a=10(默认0 → 赋5 → 赋10)

​**✅ 终极总结**

  1. 类加载时:静态成员(变量/代码块)按父→子顺序初始化

  2. 实例化时

    • 父类实例成员 → 父类构造
    • 子类实例成员 → 子类构造
  3. 静态只一次:无论创建多少实例,静态数据仅初始化一次

需要注意 类加载的时候会上锁 其他线程会阻塞

相关推荐
parafeeee2 小时前
程序人生-Hello’s P2P
数据库·后端·asp.net
bug攻城狮3 小时前
Spring Boot应用内存占用分析与优化
java·jvm·spring boot·后端
今天你TLE了吗4 小时前
JVM学习笔记:第八章——执行引擎
java·jvm·笔记·后端·学习
XPoet4 小时前
AI 编程工程化:Rule——给你的 AI 员工立规矩
前端·后端·ai编程
韩立学长5 小时前
基于Springboot校园志愿者服务平台77pz7812(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
Java基基5 小时前
Spring让Java慢了30倍,JIT、AOT等让Java比Python快13倍,比C慢17%
java·开发语言·后端·spring
qq_12498707535 小时前
基于SpringBoot微信小程序的智能在线预约挂号系统(源码+论文+部署+安装)
spring boot·后端·微信小程序·毕业设计·计算机毕设·毕业设计源码
Victor3565 小时前
MongoDB(34)什么是聚合管道(Aggregation Pipeline)?
后端
Victor3565 小时前
MongoDB(35)聚合操作的常见阶段有哪些?
后端
追逐时光者6 小时前
2026年全面且实用的 Visual Studio 插件推荐,开发效率提升利器!
后端·visual studio