商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java 中 static 块在子类构造器之前执行吗

Java 中 static 块在子类构造器之前执行吗

  发布于2026-07-05 阅读(0)

扫一扫,手机访问

很多开发者在面试时都被“static块和构造器执行顺序”这道题绊倒过,甚至对着一堆输出结果看了半天才恍然大悟。其实,把这层逻辑捋顺了,你会发现它一点都不神秘,反而很有章法。先说结论:static 块确实在子类构造器之前执行,而且这个“之前”的跨度,比很多人想象的要大得多——它甚至在任何子类对象被创建之前就已经跑完了

这背后的关键,在于static块属于类初始化阶段。注意,这不是对象创建阶段。类初始化的触发条件是类首次被主动使用,比如 new Child()、调用子类的static方法、或者访问子类非编译期常量的static字段。这些东西一旦发生,JVM就会启动类加载过程,并且在这个过程的最后一步执行所有static块。更重要的是,这个阶段发生在任何构造器运行之前,而且全程只执行一次。你猜怎么着?即便你连续new了100个Child对象,static块也只在第一次触发时跑一遍。

展开来说,这个过程像一条严格的时间线:

  • 父类的static块最先执行(因为要加载一个类,必须先加载它的父类)。
  • 然后才是子类的static块(当子类被首次主动使用时触发,此时父类已经初始化完毕)。
  • 至此,类初始化阶段彻底完成。这时类才算是“准备好了”,后续才可能进入对象创建流程。
  • 当你真正执行 new Child() 时,才会触发对象实例化阶段:父类实例块 → 父类构造器 → 子类实例块 → 子类构造器

看清楚没有?static块和子类构造器之间,隔着整整两个阶段:
① 类初始化 —— 所有static块、static变量赋值都在这里完成。
② 对象实例化 —— 实例块、构造器从头到尾排着队执行。

市场上不乏有这样的误解:“static块是不是在new出来的那一刻才跑?” 真相是,它可能早于new很早就执行了。举个例子,你先调用了子类的某个静态方法,static块就已经被触发执行;等后来你再new子类对象,它不会再跑第二遍。这就是“只执行一次”的彻底体现。

几个需要特别留意的细节:

  • 多个static块会按照在源码中从上到下的顺序依次执行。
  • 如果某个static块里抛出了未捕获的异常,那整个类的初始化就会宣告失败。此后所有对该类的访问(new、调用静态方法等)都会直接抛出 ExceptionInInitializerError。这种情况在生产环境里一旦出现,通常意味着全局准备阶段出了大问题。
  • static块里不能访问 this 或任何非静态成员 —— 因为此刻对象还没创建,不存在 this
  • 它最合适的使用场景就是做一次性的全局准备:比如注册JDBC驱动、加载配置文件、校验静态常量等。
  • 还有一点容易被忽略:即使子类从来没有被 new 过,只要它被主动引用(比如调用其静态方法),static块照样会乖乖执行。

整个逻辑不复杂,但确实容易搞混。关键在于把“类初始化”和“对象实例化”这两个阶段分清楚,脑子里画一条清晰的时间线,再看到类似问题就不会犹豫了。

本文转载于:https://www.php.cn/faq/2739162.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注