java学习日记-多态与好玩的写法

java 复制代码
Payable[] methods = {
            new Alipay(1000),
            new WechatPay(500),
            new CreditCard(2000)
        };

学习java的时候,发现一段好玩的代码。

这个和平时写的Payable p = new Alipay(),有所不同。

需要拆成三步理解:

声明一个数组:Payable\[\] methods

数组类型是 Payable(接口类型)

意思是:这个数组里装的元素,必须是"实现了 Payable 接口的对象"

创建三个对象:

new Alipay(1000) → 支付宝对象,余额 1000
new WechatPay(500) → 微信对象,余额 500
new CreditCard(2000) → 信用卡对象,额度 2000

放进数组:

这三个对象的实际类型分别是 Alipay、WechatPay、CreditCard

但它们的引用类型都被当作 Payable

这里需要说到一个引用类型和实际类型区别

java 复制代码
Payable p = new Alipay(1000);
//  ↑              ↑
// 引用类型        实际类型
// (接口)        (具体类)

引用类型(编译时) Payable 编译器只认它是 Payable,只能调用 Payable 里声明的方法

实际类型(运行时) Alipay JVM 知道它真正是 Alipay,调用方法时执行 Alipay 的实现

这就是向上转型(upcasting):子类对象可以自动赋值给父类/接口引用,因为"支付宝 是一种 支付方式"。

为什么能这样写呢?

因为 Alipay、WechatPay、CreditCard 都 implements Payable:

java 复制代码
public class Alipay implements Payable { ... }
public class WechatPay implements Payable { ... }
public class CreditCard implements Payable { ... }

所以它们都满足"是一个 Payable"的条件,可以放进 Payable\[\] 数组。

以及后面的这一段代码

java 复制代码
for (Payable p : methods) {
    System.out.println("当前余额/额度:" + p.getBalance());
    p.pay(300);
    System.out.println("---");
}

我觉得这一段代码的for有点类似JavaScript中的for in与for of的写法,像一种简写。

变量 p 的引用类型永远是 Payable

但每次循环,p 指向的实际对象不同

调用 p.pay(300) 时,JVM 在运行时根据实际类型决定执行哪个 pay()。

java 复制代码
循环轮次	p实际指向	执行的方法
第 1 轮	Alipay 对象	Alipay.pay()
第 2 轮	WechatPay 对象	WechatPay.pay()
第 3 轮	CreditCard 对象	CreditCard.pay()

同一行代码 p.pay(300),运行时表现不同 ------ 这就是多态(动态绑定 / 运行时绑定)。

相关推荐
天河归来8 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL9 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
砚底藏山河10 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
猿究院_夏燊11 小时前
MySQL 的四种隔离级别
java·数据库·mysql
码流子11 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
霸道流氓气质12 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
云创智城-yuncitys12 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
文丑颜不良啊12 小时前
LeetCode1661~1680题目解析
java·leetcode
子非鱼@Itfuture12 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李12 小时前
openFeign入门
java·开发语言·前端