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

Java向上转型为何会调用被重写的Girl类方法?

Java向上转型的核心疑问解答

1. mom变量指向的不是Mom实例

Mom mom = new Girl()这句代码里,实际创建的是一个Girl实例,mom这个变量只是被声明为Mom类型,它的作用是限制你通过这个变量只能访问Mom类中定义的成员(包括子类继承或重写的),但底层指向的对象本质还是Girl。

你看到Mom构造方法被调用,是Java继承的初始化规则导致的:子类构造方法执行时,会先隐式调用父类的无参构造方法(如果没显式写super(),Java会自动加),目的是先初始化父类的成员变量和逻辑,再初始化子类自己的部分。这不是因为创建了Mom实例,而是Girl实例的初始化必须包含父类的初始化步骤。

2. 调用Girl的test()是多态的运行时绑定特性

Java中实例方法的调用是运行时绑定的,也就是说,调用哪个方法不是看变量的声明类型(Mom),而是看实际创建的对象类型(Girl)。只要子类Girl重写了父类Mom的test()方法,运行时就会执行子类的实现。

举个代码例子更清楚:

class Mom {
    public Mom() {
        System.out.println("Mom构造方法被调用");
    }

    public void test() {
        System.out.println("Mom的test方法");
    }
}

class Girl extends Mom {
    public Girl() {
        System.out.println("Girl构造方法被调用");
    }

    @Override
    public void test() {
        System.out.println("Girl的test方法");
    }
}

public class Demo {
    public static void main(String[] args) {
        Mom mom = new Girl();
        mom.test();
    }
}

运行这段代码会输出:

Mom构造方法被调用
Girl构造方法被调用
Girl的test方法

总结你的困惑点

调用Mom构造方法是继承初始化的必要流程,而执行Girl的方法是多态的运行时决定,两者并不矛盾。mom变量始终指向的是Girl实例,只是它的声明类型让你只能用Mom类的“视角”去操作这个实例,但实例本身的真实类型决定了重写方法的执行逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:45:59