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

为什么如下Java继承相关程序输出0而非预期的100?

Java程序输出结果解释

核心原因是Java子类实例化执行顺序+方法动态绑定的共同作用:

  • 执行new B()创建子类实例时,会优先触发父类A的构造方法执行,此时子类B的自身实例变量还未进入初始化流程,int类型成员变量的默认初始值为0。
  • Java的方法动态绑定规则:父类构造方法中调用的printValue()是可重写的实例方法,当前运行时的实例实际是B类对象,所以会优先调用B类重写后的printValue()实现,而非A类的原方法。
  • B类重写的printValue()读取的是B类自己定义的value变量,此时这个变量还没执行赋值为200的逻辑,只能拿到默认值0,因此最终输出Value from B : 0。

为什么预期的100不会出现?

通常是默认认为父类构造里调用的是A类自己的printValue()方法,会读取A类的value值100,但因为多态的存在,只要子类重写了该方法,就会优先调用子类实现,这也是Java中不建议在构造方法中调用可重写方法的核心原因,很容易出现这种未初始化的异常逻辑。

内容的提问来源于stack exchange,提问作者A.Y.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:48:05