简单理解
1、封装
封装的实质,是提供了新的数据类型。
2、继承
从外部看,从父类(基类)继承得到的子类(导出类)就像一个与基类具有相同接口(非interface
声明的接口)的新类。当创建了一个导出类的对象时,该对象就已经包含了一个基类的子对象。继承带来了多态的便捷性。
导出类可以通过覆写(@Override
)基类的方法,来使同一个方法根据自己特性的不同而产生不同的表现和作用。
3、多态
多态,即将改变的事物与未变的事物分离开。
通过继承而来的导出类,能够使用向上转型的方式,来达到后期绑定(也称为动态绑定或运行时绑定)。
- 绑定:将一个方法用同一个方法主体关联起来。
- 后期绑定:运行时根据对象的类型进行绑定。
具体谈多态的特性
先通过一段代码,来解释普通类继承、抽象类继承、接口实现分别如何实现多态。
1 | abstract class Transportation { |
1、普通类继承
导出类不一定需要覆写基类的所有方法,导出类对象中包含了基类的子对象,故通过getWheelNum()
方法,可以获得基类中的成员变量wheelNum
。
2、抽象类继承
抽象类的导出类必须覆写基类的抽象方法,赋予具体实现。
3、接口实现
实现了某接口的类必须覆写接口中所有的方法,赋予具体实现。
所有导出类,都可以通过向上转型的方式,在运行时绑定,从而实现多态性。
抽象类与接口的区别
- 接口只能定义抽象方法,而抽象类可以定义非抽象方法。
- 类只能单继承,而接口可以多实现。
深层讲解
参考链接:https://blog.csdn.net/aptentity/article/details/68942916
- 抽象类
- 对类型进行隐藏,可以构造出一个固定的一组行为的抽象描述,一个行为可以有任意个可能的具体实现方式。这个抽象的描述就是抽象类。(即多态性的体现)
- 这一组任意个可能的具体实现表现为所有可能的导出类,模块可以操作一个抽象类,由于模块依赖于一个固定的抽象类,那么它是不允许修改的。同时通过这个抽象类进行派生,拓展此模块的行为功能。
- 接口
- 接口可以补充Java只有单继承的特性,实现“多继承”。
- 把程序模块进行固化的契约,降低偶合。把若干功能拆分出来,按照契约来进行实现和依赖。
- 定义接口有利于代码的规范。
抽象类强调的是从属关系,接口强调的是功能。