理解Abstract class和Interface
语法和实践上的区别
- 抽象类主要是类对象的抽象集合
- 抽象方法主要是类方法的抽象集合
Abstract Class | Interface | |
实例化 | 不能 | 不能 |
类 | 是一种继承关系,一个类智能使用一次继承关系。 可以通过继承多个接口实现多重继承 |
一个类可以实现多个接口 |
数据成员 | 可以有自己的 | 必须是默认的static final |
方法成员 | 可以有私有方法,有非abstract方法,如果有abstract方法, 子类必须实现,否则也必须是abstract的 |
默认是public abstract类型 |
设计理念 | 表示的”is-a”关系 | 表示是”like-a”关系 |
集成和抽象 | 需要继承,要用extends关键字 | implements关键字 |
应用 | 主要在代码实现方面发挥作用,用于实现代码的重用 | 主要在架构设计方面发挥作用,主要用于 定义模块间的通信契约(依赖倒转原则) |
abstract class和interface在使用上最大的区别应当是IS A 和 LIKE A 的区别,继承一个抽象类表示是什么,而实现一个接口仅仅表示实现了某个功能,即使在他们可以实现对方功能的情形下也应当明确区分其区别(开闭原则),这影响到代码的可维护性和可阅读性。
另一方面,Java是不支持多继承的,却可以同时实现多个接口,如果我们继承了某个抽象类,就应当表
示子类在本质上属于父类(
里氏替换原则),而接口的实现仅仅表示可以完成某种功能。也就是说,使用继承描述不会轻易改变的更本质的部分,而使用接口实现更灵活的扩展功能。(
接口隔离原则和合成复用原则)。
需要说明的是,Java 8 增强后的接口可以定义默认方法(使用 default 修饰的方法)和
类方法(使用 static 修饰的方法),接口中的默认方法和类方法都不再是抽象方法,都需要
提供方法体。Java 9 则允许接口中定义 private 方法,private
方法可以拥有方法体。