为什么如下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
相关产品推荐
相关产品推荐

