Java静态代码块与实例代码块的使用场景

发布时间 - 2026-01-07 00:00:00    点击率:
静态代码块只在类加载时执行一次,用于类级别初始化;实例代码块每次new对象时执行,用于对象初始化;二者执行顺序固定且不可混淆。

静态代码块只在类加载时执行一次

静态代码块 static { ... } 在类第一次被 JVM 加载并初始化时运行,且仅执行一次。它不依赖任何对象实例,适合做类级别的资源准备,比如初始化静态配置、注册驱动、预热缓存。

常见错误是误以为每次 new 对象都会触发静态块——实际不会。如果你看到日志里静态块反复打印,大概率是类被多个 ClassLoader 重复加载(如 Web 应用中热部署、OSGi、模块化环境)。

  • 不能访问非静态成员变量或方法(编译报错:non-static variable xxx cannot be referenced from a static context
  • 执行顺序早于任何构造方法,也早于实例代码块
  • 多个静态块按源码顺序依次执行,可用来分段初始化不同模

实例代码块在每次 new 对象时都执行

实例代码块 { ... }(无 static 修饰)会在每次调用构造方法前执行,且在构造方法体之前。它的作用相当于把重复的初始化逻辑从多个构造方法中抽出来,避免复制粘贴。

典型使用场景是:类有多个重载构造器,但都有共同的字段赋值、状态校验或资源预分配逻辑。

  • 可以访问静态和非静态成员(包括 this
  • 执行时机在构造方法的隐式或显式 super() 调用之后、构造方法体之前
  • 多个实例块也按源码顺序执行;若与字段初始化混合,注意字段声明位置会影响实际赋值顺序

静态块 vs 实例块:别在静态块里 new 实例

虽然语法允许在静态块中写 new MyClass(),但这会强制触发该类的初始化流程,可能引发意外的递归或死锁,尤其当构造过程又间接依赖当前类的其他静态资源时。

更隐蔽的问题是:如果实例初始化抛出异常(比如 NullPointerException),整个类加载失败,后续所有对该类的引用都会抛 NoClassDefFoundError,堆栈里却看不到原始异常原因。

  • 静态块中应只做轻量、确定性高的操作(如赋值常量、注册单例、设置系统属性)
  • 需要“首次使用才创建实例”的逻辑,优先用懒汉式单例(配合 volatile + 双重检查)或 java.util.concurrent.ConcurrentHashMap 缓存
  • 若必须在类加载阶段触发某些副作用(如启动后台线程),确保线程不阻塞、不依赖本类未初始化完成的部分

看一眼执行顺序就清楚了

下面这段代码能直观反映三者的执行时序:

public class InitOrder {
    static { System.out.println("1. 静态块"); }
    { System.out.println("2. 实例块"); }
    public InitOrder() { System.out.println("3. 构造方法"); }
    public static void main(String[] args) {
        System.out.println("开始 new");
        new InitOrder();
        new InitOrder();
    }
}

输出是:

1. 静态块
开始 new
2. 实例块
3. 构造方法
2. 实例块
3. 构造方法

注意:静态块只在 main 方法第一次触及该类时触发,不是在 javac 编译时,也不是在 main 方法声明处。

真正容易被忽略的是「类加载」和「类初始化」的区别:同一个类被不同 ClassLoader 加载,会得到不同的类对象,各自拥有独立的静态变量和静态块执行记录——这在插件化、热更新、测试 mock 场景下特别关键。


# java  # ssl  #   # ai  # 区别 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速生成ASP一键建站模板并优化安全性?  如何在云主机上快速搭建多站点网站?  实例解析angularjs的filter过滤器  Python并发异常传播_错误处理解析【教程】  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何快速生成高效建站系统源代码?  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Android利用动画实现背景逐渐变暗  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何快速搭建高效可靠的建站解决方案?  如何在Tomcat中配置并部署网站项目?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何获取免费开源的自助建站系统源码?  jquery插件bootstrapValidator表单验证详解  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  米侠浏览器网页背景异常怎么办 米侠显示修复  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何用景安虚拟主机手机版绑定域名建站?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  潮流网站制作头像软件下载,适合母子的网名有哪些?  如何快速搭建高效香港服务器网站?  在centOS 7安装mysql 5.7的详细教程  免费视频制作网站,更新又快又好的免费电影网站?  利用python获取某年中每个月的第一天和最后一天  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  长沙做网站要多少钱,长沙国安网络怎么样?  C++时间戳转换成日期时间的步骤和示例代码  大连 网站制作,大连天途有线官网?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何在阿里云购买域名并搭建网站?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  千库网官网入口推荐 千库网设计创意平台入口  Linux系统命令中screen命令详解  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel如何创建自定义中间件?(Middleware代码示例)  独立制作一个网站多少钱,建立网站需要花多少钱?  Laravel如何处理文件下载请求?(Response示例)  网站制作价目表怎么做,珍爱网婚介费用多少?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Python正则表达式进阶教程_复杂匹配与分组替换解析  再谈Python中的字符串与字符编码(推荐)