多态
什么是多态呢?说白就是子类的多种形态,这里说到了子类的多种形态,那么一定就要考虑到,要想有多态,就需要有继承结构,这是前提条件
以下就是多态的格式
父类类型 变量名 = new 子类/实现类构造器;
变量名.方法名();
口诀:父类引用指向子类对象,调用方法时看具体对象,不看引用类型
为了更好的理解,我在下面举个例子,比如我们要设计一个支付系统,分为微信支付和支付宝支付
这里定义了一个支付的父类接口
package Test; public interface Payment { void pay(Long amount); }微信支付类,实现该接口
package Test; public class WechatPay implements Payment{ @Override public void pay(Long amount) { System.out.println("使用微信支付,支付了"+ amount+ "元"); } }支付宝类,实现该接口
package Test; public class Alipay implements Payment{ @Override public void pay(Long amount) { System.out.println("使用支付宝支付,支付了"+ amount+ "元"); } }运行多态
public class PayService { public static void main(String[] args) { //微信支付 WechatPay wechatPay = new WechatPay(); executePayment(wechatPay,100L); //支付宝支付 Alipay alipay = new Alipay(); checkoutService.checkout(alipay,12000L); } public static void executePayment(Payment payment, Long amount){ payment.pay(amount); } }多态的运行特点
在调用成员变量的时候,就遵循一个规则就是编译看左边,运行也看左边
而在调用成员方法的时候,也遵循一个规则就是编译看左边,运行也看右边
可见以下分析图:
多态的优势与弊端
多态的优势,其一就是降低代码的耦合性,这个已经在上面说过了
接下来,我们说一下多态的弊端
多态的这种写法不能调用子类当中的特有的方法
我们应该怎么解决呢
这就需要的到我们之前强制类型转换的思想,但是这个强转,一定要对应相应的类型,不能瞎转,否则会抛出异常
这里还有个小细节就是如果你不知道别人写的多态是什么类型,那么这个时候,我们就需要对这个多态做判断
如fu f=new zi1
fu f=new zi2
if(f 是 zi1){
对zi1进行强转
}else if(f 是 zi2){
对zi2进行强转
}
这里就要涉及到
instanceof关键字
if(f instanceof zi1){
对zi1进行强转
}else if(f instanceof zi2){
对zi2进行强转
}