ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 抽象类与接口 ### 抽象类是啥~ 官方:抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 > 官方的解释果然抽象~ 民间: 在面向对象的概念中,世间万物通过类来描绘的,但如果一个类中没有包含足够的信息来描绘一个具体的事物对象,这样的类就是抽象类。 ***** 场景:比如说,我们熟悉的中华田园犬、泰迪、二哈等等大小形态各有不同,我们怎么把他们抽象一下呢?那就是他们都有一些本质上相同的东西那就是他们都是狗,是狗就有耳朵,尾巴,四肢等等,我们把这些特征给抽象出来就可以形成一个抽象类,至于耳朵是啥样的,尾巴是长是短,颜色是啥,这就需要具体的子类实现狗这个抽象方法了。 <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)