Java多态核心疑问:多态的载体是引用变量还是对象?
多态的载体:引用变量与对象的角色辨析
先给结论:Java里多态的核心依托是引用变量,但对象本身的类型从创建起就固定不变,两本书的说法本质不冲突,只是表述角度不同。
拆解两本书的表述
《Java编程语言》里说“对象可以有多种形式”,这是一种简化的实用视角——当我们用父类引用指向子类对象时,这个对象可以被当作父类实例来使用,也可以还原成子类实例,看起来像是有多种形式,但本质是引用的类型赋予了它不同的“使用姿态”,对象本身的类型从没变过。
Sun教育服务的教材表述更贴近底层机制:
- 对象只有一种形式:完全正确。比如
new Manager()创建的对象,从诞生到销毁都是Manager类型,不会变成Employee或者其他类型。 - 引用变量可以指向不同形式的对象:这是多态实现的关键。父类类型的引用可以指向任意子类对象,比如
Employee emp = new Manager();,emp这个引用的静态类型是Employee,但它指向的对象实际类型是Manager。 - “Manager类可以访问Employee类的方法”:这是继承的基础特性,子类继承父类的方法,也是多态能实现的前提——当用父类引用调用方法时,会动态绑定到对象实际类型的实现。
- 对象只有一种形式:完全正确。比如
用代码直观理解
class Employee { public void work() { System.out.println("员工开展工作"); } } class Manager extends Employee { @Override public void work() { System.out.println("经理统筹团队工作"); } public void approveRequest() { System.out.println("经理审批申请"); } } public class PolymorphismTest { public static void main(String[] args) { // 父类引用指向子类对象 Employee emp = new Manager(); // 多态体现:调用work()时,实际执行Manager的重写方法 emp.work(); // 输出:经理统筹团队工作 // 编译报错:emp的静态类型是Employee,找不到approveRequest方法 // emp.approveRequest(); // 强制转换为Manager类型后,才能调用子类专属方法 ((Manager) emp).approveRequest(); // 输出:经理审批申请 } }
最终梳理
- 对象是“单态”的,它的实际类型固定不变,不存在多种形式。
- 引用变量是多态的载体:正是因为引用可以指向不同子类对象,并且方法调用时会根据对象实际类型动态绑定,才让我们能写出灵活的多态代码。
- 两本书的表述只是角度不同:前者站在“如何使用对象”的视角简化描述,后者站在“底层机制”的视角精准说明。
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

