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

Java多态核心疑问:多态的载体是引用变量还是对象?

多态的载体:引用变量与对象的角色辨析

先给结论:Java里多态的核心依托是引用变量,但对象本身的类型从创建起就固定不变,两本书的说法本质不冲突,只是表述角度不同。

拆解两本书的表述

  1. 《Java编程语言》里说“对象可以有多种形式”,这是一种简化的实用视角——当我们用父类引用指向子类对象时,这个对象可以被当作父类实例来使用,也可以还原成子类实例,看起来像是有多种形式,但本质是引用的类型赋予了它不同的“使用姿态”,对象本身的类型从没变过。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:33:20