Payable[]methods{newAlipay(1000),newWechatPay(500),newCreditCard(2000)};学习java的时候发现一段好玩的代码。这个和平时写的Payable p new Alipay()有所不同。需要拆成三步理解声明一个数组Payable[] methods数组类型是Payable接口类型意思是这个数组里装的元素必须是实现了 Payable 接口的对象创建三个对象new Alipay(1000) → 支付宝对象余额 1000new WechatPay(500) → 微信对象余额 500new CreditCard(2000) → 信用卡对象额度 2000放进数组这三个对象的实际类型分别是 Alipay、WechatPay、CreditCard但它们的引用类型都被当作 Payable这里需要说到一个引用类型和实际类型区别PayablepnewAlipay(1000);// ↑ ↑// 引用类型 实际类型// (接口) (具体类)引用类型编译时 Payable 编译器只认它是 Payable只能调用 Payable 里声明的方法实际类型运行时 Alipay JVM 知道它真正是 Alipay调用方法时执行 Alipay 的实现这就是向上转型upcasting子类对象可以自动赋值给父类/接口引用因为支付宝 是一种 支付方式。为什么能这样写呢因为 Alipay、WechatPay、CreditCard 都 implements PayablepublicclassAlipayimplementsPayable{...}publicclassWechatPayimplementsPayable{...}publicclassCreditCardimplementsPayable{...}所以它们都满足是一个 Payable的条件可以放进 Payable[] 数组。以及后面的这一段代码for(Payablep:methods){System.out.println(当前余额/额度p.getBalance());p.pay(300);System.out.println(---);}我觉得这一段代码的for有点类似JavaScript中的for in与for of的写法像一种简写。实际上它是java中增强型 for 循环也叫 for-each 循环。变量 p 的引用类型永远是 Payable但每次循环p 指向的实际对象不同调用 p.pay(300) 时JVM 在运行时根据实际类型决定执行哪个 pay()。循环轮次 p实际指向 执行的方法 第1轮Alipay对象Alipay.pay()第2轮WechatPay对象WechatPay.pay()第3轮CreditCard对象CreditCard.pay()同一行代码 p.pay(300)运行时表现不同 —— 这就是多态动态绑定 / 运行时绑定。