Java多态通过父类或接口类型声明变量、参数和返回值,实际指向具体子类对象,实现面向抽象编程;定义Payment等接口契约,业务类依赖抽象而非具体实现,结合依赖注入与运行时动态绑定,使代码稳定、行为可变、易于扩展。

Java 多态实现面向抽象编程,核心是用父类或接口类型声明变量、参数和返回值,而实际指向具体子类对象。这样代码不依赖“谁来实现”,只关心“能做什么”,自然就脱离了具体类的细节。
用接口或抽象类定义行为契约
面向抽象编程的第一步,是把共性行为抽成接口或抽象类,只声明方法,不写具体实现。比如支付场景中,不写 Alipay.pay() 或 WechatPay.pay(),而是定义一个 Payment 接口:
- interface Payment { void pay(double amount); }
- 所有支付方式(支付宝、微信、银行卡)都 implements Payment,各自实现 pay() 方法
- 业务类如 OrderService 只持有 Payment payment 字段,完全不知道也不需要知道具体是哪种支付
依赖注入代替硬编码 new
避免在业务逻辑里直接 new AlipayPayment()。把具体对象的创建交给外部,比如构造方法传入、工厂方法返回,或由 Spring 等框架管理:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- OrderService service = new OrderService(new WechatPayment());
- 后续想换成 Apple Pay?只需换一个实现类实例,OrderService 的代码一行不用改
- 新增支付方式时,只要实现 Payment 接口,老代码自动兼容
运行时动态绑定,行为由实际对象决定
多态的关键机制是 JVM 在运行时查对象的真实类型,调用对应子类的方法。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 你写的是 payment.pay(99.9),但执行的是 WechatPayment.pay() 还是 AlipayPayment.pay(),取决于 payment 当前引用的是哪个对象
- 同一行代码,在不同运行时刻可以有不同表现——这正是“面向抽象”的力量:代码稳定,行为可变
- 如果用具体类编程,就得写 if-else 判断类型再分别调用,既冗余又难维护
配合向上转型隐藏实现细节
声明时用抽象类型,赋值时用具体子类,这就是向上转型:Payment p = new AlipayPayment();
- 变量 p 只能调用 Payment 接口中声明的方法,子类独有的方法(如 AlipayPayment.setSandboxMode())不可见
- 这种“限制”恰恰是优势:它强制调用方只关注契约,不依赖实现细节,降低了模块间的耦合
- 哪怕底层实现从支付宝换成银联,只要它们都遵守 Payment 接口,上层代码完全无感


















