程序员、编程、Java语言、后端开发、软件开发
Java疑问
为什么要使用接口interface?(好抽象的感觉)
接口的作用是什么?(人家习惯写类)
为什么不直接在实例类中进行方法实现,而是需要首先进行接口的定义?
是不是多此一举了?(麻烦死了)
我们先带着这些疑问去学习下java这个接口有什么神器功效
基础准备
- 向上转型为多个基类型
- 接口
- 父类引用指向子类实现
- 动态绑定
- 代码复用
spring源码
大家来体验下spring源码里的接口
有木有眼花缭乱的感觉啊
搞懂了这些接口,spring源码你也啃的下来了
哈哈哈哈
![44cc83381f29e400605306f52816d4a8.png](https://img-blog.csdnimg.cn/img_convert/44cc83381f29e400605306f52816d4a8.png)
spring接口的继承
看了有没有头皮发麻的感觉,这么多接口
ApplicationContext一下子继承这么多接口
![57904901682859a9f1cea7840be8e00e.png](https://img-blog.csdnimg.cn/img_convert/57904901682859a9f1cea7840be8e00e.png)
接口常识
- 接口中所有方法都是抽象的
- 接口不能直接实例化
- 接口之间可以extends实现多继承关系(如上spring源码中的)
- 接口必须实现全部方法
接口解密
1.为什么不直接在类里面写对应的方法, 而要多写1个接口(或抽象类)?
答案:实现多态.
jdk中的Map接口为例子,我们来聊聊天
HashMap
![18fe26baac1cf75c3defc9382e15b87c.png](https://img-blog.csdnimg.cn/img_convert/18fe26baac1cf75c3defc9382e15b87c.png)
HashTable
![ec218911dc00dc6a0af7cdb64c2c7a6a.png](https://img-blog.csdnimg.cn/img_convert/ec218911dc00dc6a0af7cdb64c2c7a6a.png)
这两个接口类都实现了Map接口
然后代码就可以
多态
会给开发带来相当大的灵活性。
程序汪喜欢女神
比如女神 林志玲(Class),实现了 明星 和 女人 的接口。
这样在复杂的继承结构的某类中使用它,
以后在调用seeStar(Star star)或者seeWomen(Women women)方法时,
只要传入其实现类(林志玲)即可。
多态的代码案例
Map extInfo = new HashMap();
Map treeMap = new TreeMap();
继续发问多态有什么好处(提高代码复用性)
在很多业务复杂或框架代码中,需要根据特定入参类型调用不同的代码逻辑
为了提高代码复用性,接口威力慢慢体现出来了
1
Map集合元素的比较,这是写了一个工具类入参是Map接口,注意不是HashMap或TreeMap
这里一个工具方法就搞定了,如果没有接口多态的特性,你需要写多个集合比较方法,
那是相当的冗余
public static boolean equals(Map left, Map right) {
//TODO 集合元素比较 ,代码省略
}
什么情况下应该使用接口而不用抽象类
抽象类和接口都可以实现多态
接口侧重表示一种能力
例子1
Spring源码中有很多带Aware后缀的接口
开始看这是什么鬼
其实都是一种获取某资源能力的接口
如下就是获取ApplicationContext资源的能力接口
![e323d45aca538b79e5cb809f0f207557.png](https://img-blog.csdnimg.cn/img_convert/e323d45aca538b79e5cb809f0f207557.png)
例子2
jdk源码中也有很多带able后缀的接口
如下迭代器
下面集合类都继承了Collection间接拥有了迭代器能力
ArrayList
HashSet
![d1e226c071c138565251287f36cfb463.png](https://img-blog.csdnimg.cn/img_convert/d1e226c071c138565251287f36cfb463.png)
例子3
Comparable 比较强
只有继承了这个接口就拥有排序的能力了
CModel 实现了了Comparable 接口
List cModel= new ArrayList();
Collections.sort(cModel);
Collections源码中
![d683b2790236c4e97db00cc065cc4d1f.png](https://img-blog.csdnimg.cn/img_convert/d683b2790236c4e97db00cc065cc4d1f.png)
集合排序例子
![c7d86a2554edc0c40ca420f64361f611.png](https://img-blog.csdnimg.cn/img_convert/c7d86a2554edc0c40ca420f64361f611.png)
运行代码
![6f0ca7965fbf585a5908f45f2667c882.png](https://img-blog.csdnimg.cn/img_convert/6f0ca7965fbf585a5908f45f2667c882.png)
底层jdk代码
![7ecf67c3ca786ebc3e824beba7147a32.png](https://img-blog.csdnimg.cn/img_convert/7ecf67c3ca786ebc3e824beba7147a32.png)
总结
- 接口可以实现多态,达到了完全解耦
- 提供代码复用性
- 提供一种通用的能力,就要考虑使用接口了
- 接口能提供多继承的能力,抽象类不行
- 设计模式中大量使用了接口的特性
历史文章
Java向上向下转型
欢迎沟通交流,在下图里
![680e4b8e5cc7f0a4420181f9f188c6f5.png](https://img-blog.csdnimg.cn/img_convert/680e4b8e5cc7f0a4420181f9f188c6f5.png)