Java父类变量存储子类对象时调用重写方法为何执行子类逻辑?
Java实例方法调用的动态绑定规则
你给出的代码如下:
class Mom{ public String sex(){ return "Female"; } } class Son extends Mom{ @Override public String sex(){ return "Male"; } } // 实例化代码 Mom mom = new Son();
执行mom.sex()返回Male是Java多态特性的正常表现,原因如下:
- 引用变量存在两种类型:声明类型(静态类型)和运行时类型(实际类型),
Mom是mom变量的声明类型,Son才是这个变量存储的实例的实际类型 - Java的实例方法调用默认采用动态分派机制:对于普通的可重写实例方法,JVM会在运行时根据变量的实际类型匹配对应方法执行,而非按照声明类型匹配
- 你的代码中Son类已经重写了父类的
sex()方法,运行时JVM检测到mom指向的实际是Son类实例,因此会执行Son类中重写后的方法逻辑,返回Male
可以和静态绑定场景做对比区分:如果是类的静态方法、成员属性,调用时会按照变量的声明类型匹配,不会采用动态绑定逻辑。比如给两个类都加上静态方法public static String getSex()分别返回对应值,调用mom.getSex()就会返回父类的Female。
内容的提问来源于stack exchange,提问作者Basit Alam
相关产品推荐
相关产品推荐

