接口和抽象类,作为 Java 解决单一继承带来的 “类的丰富度不足”的问题的2种方法。有各自的特点,在此进行一个总结。
1、 出现此种技术的原因不同。
抽象类的出现,是建立在运用 父类引用指向子类对象的 的多态技术之上的。
在反复使用这种多态技术的时候,发现,每次都是运用 子类 进行实例化,父类并没有参与实例化的机会。既然不会被实例化,那就把父类实例化的能力除掉,免生枝节。
接口的出现,是因为发现运用 抽象类 不能解决一个问题:没有继承关系的类之间也可以有共同的行为,如何把这些共同的行为 抽取 出来,单独成立一个单元,那么问题就解决了。从而出现了接口:为其他类提供 独立的 “零部件”,需要,就接口进行实例化,谁都可以找接口要,无需继承关系的 “硬条件”。
2、 语法不同
| 关键字 | 命名 | 属性 | 构造方法 |
抽象类 | abstract | 同普通类 | Public/private/static/protect/默认 | 必须有 |
接口 | interface | ***able | Public static final | 无 |
| 主要作用 | 初始化块 | 已经实现的方法 | 使用方式 |
抽象类 | 作为父类 | 有 | 可有可无 | 被继承(extends), 单继承 |
接口 | 绑在类上使用 | 有 | 无 | 被实现(implements),多实现 |
3、设计目的不同
抽象类的主要目的:保证设计者的 设计意图 被保存完整的传递下去。
设计者希望自己设计的类不被使用类的人修改,必须按照他的意图实现下去。从而达到控制调用类的人。
接口的主要目的:将设计和实现分离。
设计接口,就是把每个部件的框架画出来,具体实现全权交给实现的人。
实现者可以按照自己的意图对接口进行拼接组合和实现设计,达到实现者自己的目的。
抽象类的侧重点:类的设计者的意图。
接口的侧重点:实现接口的实现者的意图。
个人的理解:
为什么在有 抽象类的情况下, 依旧设计 接口? 二者的作用差不多: 对业务进行抽象, 让实现着根据设计者的意图进行实现。
因为: 抽象类必须被继承, 且为单继承。
大千世界, 不可能一个抽象类, 将所有的行为和属性都包含了。
有也极其复杂。
为了实现 “多继承”, 让不同的类进行组合:
接口最大的作用: 写抽象方法, 让没有继承关系的类可以共享行为, 又可以各有各的实现;