发布于2026-07-05 阅读(0)
扫一扫,手机访问
很多开发者在面试时都被“static块和构造器执行顺序”这道题绊倒过,甚至对着一堆输出结果看了半天才恍然大悟。其实,把这层逻辑捋顺了,你会发现它一点都不神秘,反而很有章法。先说结论:static 块确实在子类构造器之前执行,而且这个“之前”的跨度,比很多人想象的要大得多——它甚至在任何子类对象被创建之前就已经跑完了。
这背后的关键,在于static块属于类初始化阶段。注意,这不是对象创建阶段。类初始化的触发条件是类首次被主动使用,比如 new Child()、调用子类的static方法、或者访问子类非编译期常量的static字段。这些东西一旦发生,JVM就会启动类加载过程,并且在这个过程的最后一步执行所有static块。更重要的是,这个阶段发生在任何构造器运行之前,而且全程只执行一次。你猜怎么着?即便你连续new了100个Child对象,static块也只在第一次触发时跑一遍。
展开来说,这个过程像一条严格的时间线:
new Child() 时,才会触发对象实例化阶段:父类实例块 → 父类构造器 → 子类实例块 → 子类构造器。看清楚没有?static块和子类构造器之间,隔着整整两个阶段:
① 类初始化 —— 所有static块、static变量赋值都在这里完成。
② 对象实例化 —— 实例块、构造器从头到尾排着队执行。
市场上不乏有这样的误解:“static块是不是在new出来的那一刻才跑?” 真相是,它可能早于new很早就执行了。举个例子,你先调用了子类的某个静态方法,static块就已经被触发执行;等后来你再new子类对象,它不会再跑第二遍。这就是“只执行一次”的彻底体现。
几个需要特别留意的细节:
ExceptionInInitializerError。这种情况在生产环境里一旦出现,通常意味着全局准备阶段出了大问题。this 或任何非静态成员 —— 因为此刻对象还没创建,不存在 this。new 过,只要它被主动引用(比如调用其静态方法),static块照样会乖乖执行。整个逻辑不复杂,但确实容易搞混。关键在于把“类初始化”和“对象实例化”这两个阶段分清楚,脑子里画一条清晰的时间线,再看到类似问题就不会犹豫了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8