该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
相关产品推荐
相关产品推荐

