
java 向上转型(如 `mom mom = new girl()`)不会改变对象的实际类型,仅限制引用可访问的成员;运行时方法调用由对象真实类型决定,因此重写的 `test()` 仍执行 `girl` 版本——这是动态绑定与多态的核心体现。
在 Java 中,Mom mom = new Girl(); 这行代码常被误解为“将 Girl 对象转换成了 Mom 对象”。实际上,它只是创建了一个 Girl 实例,并用一个类型为 Mom 的引用变量来指向它。关键点在于:
- ✅ 对象真实类型始终是 Girl:new Girl() 在堆内存中创建的是 Girl 类型的实例,构造器执行顺序为 Mom() → Girl()(若未显式调用 super(),编译器自动插入),因此 Mom 构造器确实会被调用,但这只是为了完成父类初始化,并不意味着对象变成了 Mom。
- ✅ 引用类型决定编译期可见性:mom 只能调用 Mom 中声明(或继承)的公开方法和字段;若 Girl 有独有方法(如 dance()),编译器会报错:cannot resolve symbol dance。
- ✅ 方法调用在运行时动态绑定:当执行 mom.test() 时,JVM 查看 mom 所指向对象的实际运行时类型(即 Girl),并查找该类型中对 test() 的最具体重写实现——于是执行 Girl.test(),而非 Mom.test()。
下面是一个最小可复现示例:
class Mom {
Mom() {
System.out.println("Mom constructor");
}
void test() {
System.out.println("Mom's test()");
}
}
class Girl extends Mom {
Girl() {
System.out.println("Girl constructor");
}
@Override
void test() {
System.out.println("Girl's test()");
}
}
public class Main {
public static void main(String[] args) {
Mom mom = new Girl(); // 输出:Mom constructor → Girl constructor
mom.test(); // 输出:Girl's test()
}
}⚠️ 注意事项:
- 构造器不会被重写(override),也不会被多态调用——它属于类初始化过程,按继承链自顶向下执行;
- static 方法、private 方法、构造器均遵循静态绑定(编译期决定),不受多态影响;
- 若需强制调用父类版本,可在子类中用 super.test(),但外部引用无法绕过多态直接触发父类实现;
- instanceof 和向下转型(如 (Girl) mom)可验证实际类型,但需确保类型安全,否则抛出 ClassCastException。
总结:向上转型是安全的类型放宽,它让代码更灵活、可扩展;而多态保证了“谁创建的,就由谁的行为负责”——这正是面向对象设计中开闭原则与里氏替换原则的底层支撑。理解这一点,是掌握 Java 继承与抽象的关键一步。
立即学习“Java免费学习笔记(深入)”;










