01.编译时多态:方法的重载;
02.运行时多态:
存在的必要条件:要有继承;要有重写;父类引用指向子类对象
方法的重写、重载与动态连接构成 多态性
1.methods方法重载和重写的区别
方法重写(overriding):父类和子类中 @override
1、也叫子类的方法覆盖父类的方法,要求返回值、方法名和参数都相同。
2、子类抛出的异常不能超过父类相应方法抛出的异常。(子类异常不能超出父类异常)
3、子类方法的的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
4.方法被定义为final不能被重写
方法重载(overloading):
重载是在 同一个类 中的两个或两个以上的方法,
拥有相同的方法名,但是参数却不相同,方法体也不相同,
最常见的重载的例子就是类的构造函数,可以参考API帮助文档看看类的构造方法
对于构造方法-编译器需要调蓄出具体执行哪个方法-通过用 各个方法给出的参数类型 与 特定方法所调用的值类型进行 匹配
如果找不到匹配的参数则会产生编译错误--Overloading resolution 重载解析
Java允许重载任何方法:
多个同名函数同时存在,具有不同的参数个数/类型。-重载Overloading是一个类中多态性的一种表现
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性
2.定义一个接口类型的引用变量 来 引用实现接口的
示例:
多态
集合类的示例
1.private Map<String, Map<String, String>> configMap = new HashMap<String, Map<String, String>>();
List<String> keyList = new ArrayList<String>(dataMap.keySet());
Collections.sort(keyList);
Map.Entry<String, String> entry : Map<String, String> map.entrySet()
自定义示例
定义一个接口类型的引用变量 来 引用实现接口的类的实例,当这个引用调用方法时,
它会根据实际引用的类的实例来判断具体调用哪个方法。
该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。
//定义接口InterA
interface InterA { void fun(); }
//实现接口InterA的类B
class B implements InterA { public void fun() {System.out.println(“This is B”); }
//实现接口InterA的类C
class C implements InterA { public void fun() {System.out.println(“This is C”); } }
//主类main
class Test { public static void main(String[] args) { InterA a; a= new B(); a.fun(); a = new C(); a.fun(); }}
基于接口的多态
设计模式中有:“代码尽量依赖于抽象,不依赖于具体代码依赖于抽象的好处是,代码可以方便替换。
例如,代码
List list = new ArrayList();下面通过list来操作集合。代码编写后发现集合使用的不准确,
应该使用LinkedList,那么只要修改一行代码
List list = new LinkedList();就可以,这行以后的代码不需要修改,
因为List接口保证了调用的都是接口中的方法,而ArrayList与LinkedList都实现了List接口
ArrayList list = new ArrayList()这种形式的话,
那么list访问到的就可能是ArrayList里独有的方法而非List接口中的方法。
这样替换成LinkedList的时候就有可能需要修改很多的代码
因为存放在ArrayList里的值都转换成了Object类型,所以 使用ArrayList内部的值时,必须强制转换才行
List<String> list = new ArrayList<String>();
List<String> list = (String)new ArrayList(); 强制类型转换
自定义类和接口的方式和步骤如下
01.接口
public interface IDownloadCenter {
DownloadResult download(String payType,String merchantId,String date) throws Exception;
//void writeFileMerchantData(String date,String fileName,String merchantId,String payType,String merchantStatus);
}
02.实现接口的抽象类
public abstract class AbstractUnifiedDownload implements IDownloadCenter {
@Override
public DownloadResult download(String payType, String merchantId, String date) throws Exception {}
}
03继承抽象类的具体类
@Service
public class PingAnDownloadService extends AbstractUnifiedDownload {}
public class JdSdkPayDownloadService extends AbstractUnifiedDownload {}
public class SpayQuickPayDownloadService extends AbstractUnifiedDownload {}
public class XinEhuiCashDownloadService extends AbstractUnifiedDownload {}
public class YeePayDownloadService extends AbstractUnifiedDownload {
public void init() {
downloadManager.downloadManagerMap.put(BillType.dynamicH5WechatPay, this);
具体的配置-从公用的util中读取}
将以下枚举-put 进Map中
public enum BillType {
yeePay("yeePay", "易支付") ;
public String value;
public String memo;
BillType(String value, String memo) {
this.value = value;
this.memo = memo;
}
04.从Map中get 枚举
public class DownloadManager {
public Map<BillType, IDownloadCenter> downloadManagerMap = new HashMap<BillType, IDownloadCenter>();
public Map<BillType, IDownloadCenter> getDownloadManager(){
return downloadManagerMap;
}
public IDownloadCenter getCenter(BillType billType) {
return downloadManagerMap.get(billType);
}}
05.多态情况
public class DownLoadService {
iDownloadCenter = downloadManager.getCenter(BillType.get(payType.value));
DownloadResult result = iDownloadCenter.download(payType.value, merchantId, date);
}
06.具体的应用
public class DownloadAllTimer {
downLoadService.startDownloadAllFile(downTime);//下载方法}
public class UnifiedDownloadController {
downLoadService.startDownloadAllFile(date);}