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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:54:04