You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Derived类引用调用Base类静态方法时,哪些类会被初始化?

关于Java子类调用父类静态方法时的类初始化问题

Hey there, 你的解读完全正确!当调用Derived.f()(这里假设f()是在Base类中定义的静态方法,Derived继承自Base)时,确实只有Base类会被初始化,这个行为和访问Base类的非编译时常量静态字段的规则完全一致。

咱们结合JLS的规定来拆解一下:

根据Java语言规范(JLS),类或接口的初始化只会由特定触发条件引发,其中包括:

  • 调用该类的静态方法
  • 访问该类的非编译时常量静态字段
    同时,规范明确了:当调用静态方法时,实际执行的是该方法最初定义的类的实现,初始化操作也仅针对这个定义类,不会触发子类的初始化流程。

为什么会这样?核心原因在于静态方法的"类归属"特性:静态方法属于定义它的类,而非子类,也不具备多态性。当你写Derived.f()时,编译器会直接将其解析为Base.f()(如果f()是Base定义的),相当于只是借了子类的名义调用父类的静态方法,本质上还是对Base类的静态成员进行操作,自然只会触发Base的初始化。

再对比你提到的非静态方法场景:非静态方法依赖实例,要调用Derived的非静态方法,你必须先创建Derived的实例——而实例创建时会触发整个继承链的类初始化(先初始化Base,再初始化Derived),这和静态方法的场景逻辑完全不同。

至于你提到的非编译时常量静态字段场景,比如Base类中有public static int num = 100;,当你通过Derived.num访问时,同样只会初始化Base类。这和静态方法的规则是同源的:无论是静态方法还是非编译时常量静态字段,只要是通过子类名义访问父类定义的成员,初始化只会触发成员的定义类,而非访问时使用的子类。

总的来说,你的理解完全符合JLS的核心逻辑,不用怀疑自己的解读~

内容的提问来源于stack exchange,提问作者Code Complete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:34:55