You need to enable JavaScript to run this app. 该Java代码运行结果是否属于动态多态?方法修饰符影响输出原因求解
优惠活动
大模型
产品
解决方案
定价
更多

该Java代码运行结果是否属于动态多态?方法修饰符影响输出原因求解

原理说明

核心结论

原场景中A类isTrue()为private修饰时,不属于动态多态,修改为public后才触发动态多态,差异原因和Java的方法重写规则、方法分派机制直接相关:

  • private修饰的方法属于类私有成员,仅能在当前类内部被访问,不允许子类继承。此时B类中定义的isTrue()是属于B类的独立方法,和父类A的isTrue()没有重写关系,只是恰好方法名重合。
  • 代码中A b = new B()是父类引用指向子类对象,编译阶段会根据引用的静态类型(即A类)检查方法可访问性:因为createInstance是外围类HelloWorld的成员方法,和内部类A属于同一个类加载上下文,所以可以访问A的private方法,编译可正常通过。但private方法无法被重写,JVM不会做运行期动态分派,会直接调用静态类型A的isTrue()方法,因此输出A。
  • 当你把A类的isTrue()修饰符改为public后,该方法可以被子类B继承,此时B类的isTrue()满足重写的所有要求,触发动态多态机制:运行阶段会根据对象的实际类型(即B类)调用对应的重写方法,因此输出变为B。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 18:57:00