Java 代码块

一、 静态代码块 (Static Block)

  1. 格式

    java 复制代码
    static {
        // 初始化逻辑
    }
  2. 执行时机与顺序

    • 在类加载到内存的"初始化阶段"执行
    • 优先于实例代码块和构造器执行
    • 若存在多个静态代码块,按照在代码中定义的先后顺序依次执行
    • 父类的静态代码块优先于子类的静态代码块执行
  3. 作用与典型应用场景

    • 对静态成员变量进行复杂初始化(无法通过简单赋值完成时)
    • 加载配置文件、读取外部资源或建立数据库连接池等全局一次性操作
    • 注册驱动(如JDBC中的 Class.forName 旧式写法)
    • 执行仅需运行一次的校验或日志记录
  4. 注意事项

    • 只能访问静态成员(静态变量、静态方法),不能直接访问实例成员
    • 不能使用 thissuper 关键字
    • 不能抛出受检异常(Checked Exception),除非在内部捕获处理;若发生未捕获的运行时异常,会导致类加载失败,抛出 ExceptionInInitializerError
    • 即使不创建对象,只要类被主动使用(如调用静态方法、访问静态字段),静态代码块也会执行

二、 实例代码块 (Instance Initializer Block)

  1. 格式

    java 复制代码
    {
        // 初始化逻辑
    }
  2. 执行时机与顺序

    • 每次调用构造器创建对象时执行
    • 执行顺序:父类静态代码块 -> 子类静态代码块 -> 父类实例代码块 -> 父类构造器 -> 子类实例代码块 -> 子类构造器
    • 若存在多个实例代码块,按照定义顺序依次执行
    • 无论调用哪个重载构造器,实例代码块都会执行
  3. 作用与典型应用场景

    • 提取多个构造器中的公共初始化逻辑,避免代码重复
    • 对实例变量进行复杂初始化,尤其是当初始化逻辑相同但构造器参数不同时
    • 在匿名内部类中执行初始化操作(因为匿名内部类没有命名构造器)
  4. 注意事项

    • 可以访问静态成员和实例成员
    • 可以使用 this 关键字
    • 不能抛出受检异常,除非在内部处理或在所有构造器的声明中都包含该异常
    • 若仅在某个特定构造器中需要某段初始化逻辑,应直接写在构造器内,而非实例代码块中,以免在其他构造器调用时产生不必要的副作用

三、 完整执行顺序总结

假设存在继承关系,创建子类对象时的完整执行流程如下:

  1. 父类静态代码块(仅首次加载时)
  2. 子类静态代码块(仅首次加载时)
  3. 父类实例代码块
  4. 父类构造器
  5. 子类实例代码块
  6. 子类构造器

记忆口诀:静态先于实例,父类先于子类,代码块先于构造器


四、 对比总结表

特性 静态代码块 实例代码块
修饰符 static
执行次数 类生命周期内仅一次 每创建一个对象执行一次
执行时机 类加载初始化阶段 对象创建时,构造器之前
可访问成员 仅静态成员 静态成员 + 实例成员
this/super 不可用 可用
主要用途 类级别一次性初始化 对象级别公共初始化 / 匿名类初始化

五、 补充说明

  • 局部代码块 :在方法内部定义的 { },用于限制变量作用域,与方法内普通语句无异,现代Java开发中极少使用,了解即可
  • 序列化场景:实例代码块在反序列化过程中不会被执行(反序列化不调用构造器),若依赖实例代码块进行关键初始化,需注意此行为差异
  • 实践:优先使用显式构造器和静态工厂方法进行初始化,代码块仅在确实能减少重复代码或处理匿名类等特殊场景时使用,避免滥用导致代码可读性下降

相关推荐
ttwuai4 小时前
Go 后台清空操作日志失败,权限和无 WHERE 删除怎么排查?
开发语言·后端·golang
choumou_M4 小时前
SpringBoot_7:用户资源的上传与修改
java·spring boot·后端
西西弗Sisyphus4 小时前
Qt 在无边框窗口上做一套换肤系统
开发语言·数据库·qt
西西弗Sisyphus4 小时前
Qt 启动 UsageStatistic 插件报错
开发语言·qt
NeoGressAI外贸数字化4 小时前
外贸独立站零询盘排查:从 Google Search Console 到 PageSpeed 的技术实操
开发语言·c++
无小道4 小时前
C/C++——异步编程小记
开发语言·c++·c++11
奇树谦4 小时前
Pimpl 模式(d-pointer)详解:如何解决 C++ 头文件过大、编译依赖和 ABI 兼容问题
开发语言·c++
user_admin_god4 小时前
一体化数据归集接口详细设计说明
java·大数据·spring boot·后端·spring
DevOpenClub4 小时前
Markdown、HTML 和 PPT 如何稳定交付:文档转换任务的幂等发布流程
开发语言·前端·c#·html·powerpoint
程序员夏洛4 小时前
谈谈你了解的最常见的几种设计模式,说说他们的应用场景
开发语言·python·模板方法模式