## 抽象类与接口
### 抽象类是啥~
官方:抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
> 官方的解释果然抽象~
民间: 在面向对象的概念中,世间万物通过类来描绘的,但如果一个类中没有包含足够的信息来描绘一个具体的事物对象,这样的类就是抽象类。
*****
场景:比如说,我们熟悉的中华田园犬、泰迪、二哈等等大小形态各有不同,我们怎么把他们抽象一下呢?那就是他们都有一些本质上相同的东西那就是他们都是狗,是狗就有耳朵,尾巴,四肢等等,我们把这些特征给抽象出来就可以形成一个抽象类,至于耳朵是啥样的,尾巴是长是短,颜色是啥,这就需要具体的子类实现狗这个抽象方法了。
<i></i>
这就是面向对象的基本特性:抽象~ 也是比较难的能力~
### 那抽象类的作用呢~
1. 用于**隐藏**
> 对类型进行隐藏,我们可以构造出一组固定行为的抽象描述,一个行为可以有任意个可能的具体实现方式。这个抽象的描述就是抽象类。(参考多态)
2. 用于**拓展**对象的行为功能
> 因为抽象相对稳定,让其他类(模板)依赖于固定的抽象;同时通过这个抽象类进行派生,派生出任意个可能的具体实现,拓展此模块的行为功能。(参考开放闭合原则)
### 接口是啥~
官方:接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。
> 呵呵呵~
民间: 接口就是一种特殊的abstract class,但是比abstract class更加抽象。
*****
场景:很多时候,我们实际上关心的,并不是对象的类型,而是对象的**能力**,
譬如要拍个照片,很多时候,只要能拍出符合需求的照片就行,至于是用手机拍,还是用Pad拍,或者是用单反相机拍,并不重要,关心的是对象是否有拍出照片的能力,而并不关心对象到底是什么类型,手机、Pad或单反相机都可以。
**类型并不重要,重要的是能力**。
### 那抽接口的作用呢~
1. 由于Java单继承的原因,接口作为继承关系的一个补充(多继承)完成了曲线救国。
2. 把程序模块进行固化的契约,降低偶合。把若干功能拆分出来,按照契约来进行实现和依赖。(依赖倒置原则)
3. 定义接口有利于代码的规范。(接口分离原则)
来张对比图
![](https://img.kancloud.cn/4e/f2/4ef2bc8ed77a53ec89b141140d34f7f9_1930x688.png)
### 内部类
定义
>把类定义在另一个类的内部,该类就被称为内部类。
访问规则
* 拥有外部类的引用,可以直接访问外部类的成员,包括私有。
* 外部类要想访问内部类成员,必须创建对象。
分类:
- 成员内部类
- 局部内部类
- 静态内部类
- 匿名内部类
好处:
- 封装性(高内聚,低耦合)
> 内部类可以很好的实现隐藏,隐藏你不想让别人知道的操作,也即封装性。平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有`private`与`protected`权限的,但内部类可以,所以我们可以通过内部类来隐藏我们的信息,实现更好的封装。
- 实现多继承
>使用接口实现多继承的时候,是有一点弊端的,那就是,一旦实现一个接口就必须实现里面的所有方法,有时候就会出现一些累赘,但是使用内部类可以很好的解决这些问题。
- 匿名内部类实现回调功能
> 回调就是某个方法一旦获得了内部类对象的引用之后,就可以在合适的时候反过来去调用外部类实例的方法,也即允许客户类通过内部类引用调用外部类的方法。这种功能非常的灵活。
- 解决继承及实现接口出现的同名方法的问题
> 一个类需要实现一个接口,还需要继承一个类,但是要实现的这个接口和要继承的类中有个一模一样的方法,就可以建一个内部类实现这个接口。
### 结语
抽象类,相对于具体类,它用于表达抽象概念,虽然从语法上,抽象类不是必须的,但它能使程序更为清晰,减少误用,抽象类、接口、抽象类经常相互配合,接口定义能力,而抽象类提供默认实现,方便子类实现接口。
*****
### 引用与参考
[https://blog.csdn.net/aptentity/article/details/68942916](https://blog.csdn.net/aptentity/article/details/68942916)
[https://www.cnblogs.com/swiftma/p/5594961.html](https://www.cnblogs.com/swiftma/p/5594961.html)
[https://www.cnblogs.com/littlecarry/p/11939809.html](https://www.cnblogs.com/littlecarry/p/11939809.html)
[https://www.jianshu.com/p/c4f023d02f0c](https://www.jianshu.com/p/c4f023d02f0c)
[http://blog.longjiazuo.com/archives/4807](http://blog.longjiazuo.com/archives/4807)
[https://www.zhihu.com/question/26954130](https://www.zhihu.com/question/26954130)