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

