java 向上转型(upcasting)不会改变对象的实际类型,仅限制引用可访问的成员;方法调用始终基于运行时真实对象类型,因此重写(override)的方法由子类实现执行。
在 Java 中,Mom mom = new Girl(); 是典型的向上转型(upcasting):将子类 Girl 的实例赋值给父类 Mom 类型的引用变量。这一操作合法且隐式发生,但需明确两个关键事实:
而方法调用遵循 动态绑定(dynamic binding) 原则:编译期检查引用类型(Mom)是否声明了该方法(确保编译通过),运行期则根据实际对象类型(Girl)查找并执行最具体的重写版本。这就是 Java 多态(polymorphism)的核心机制。
以下是最小可复现示例:
class Mom {
Mom() {
System.out.println("Mom constructor called");
}
void test() {
System.out.println("Mom.test()");
}
}
class Girl extends Mom {
Girl() {
System.out.println("Girl constructor called");
}
@Override
void test() {
System.out.println("Girl.test()");
}
}
public class UpcastDemo {
public static void main(String[] args) {
Mom mom = new Girl(); // 向上转型:引用为 Mom,实例为 Girl
mom.test(); // 输出:Girl.test() ← 多态生效!
}
}输出结果:
Mom constructor called Girl constructor called Girl.test()
⚠️ 注意事项:
总结:向上转型 ≠ 类型转换对象,而是“以父类视角看待子类实例”。Java 的多态保障了“谁创建的,就由谁负责行为实现”,这是面向对象设计中开闭原则与可扩展性的基石。理解这一点,便不再困惑于“为何构造用父类,方法却走子类”。