抽象类(Abstract Class)
Java 提供一个叫 抽象方法
的机制,这种方法是不完整的,仅有声明而没有方法体。
abstract void f();
包含抽象方法的类叫做 抽象类
。如果一个类包含一个或者多个抽象方法
,则该类必须被限定为抽象的。
如果从一个抽象类
继承,并想创建该新类的对象,就必须为基类中的所有抽象方法
提供方法定义。
使某个类成为抽象类并不需要所有的方法都是抽象的,所以仅仅需要将某些方法生命为抽象的即可。
接口(Interface)
interface关键字
产生一个完全抽象的类,它根本没有提供任何具体实现。它允许创建者确定方法名、参数列表、返回类型,但是没有任何方法体。接口中提供了形式,而未提供任何具体实现。
在 interface关键字
前面添加 public 关键字(仅限于该接口在于其同名的文件中被定义)。
如果不添加 public 关键字,则它只具有包访问权限,这样它就只能在同一个包内使用。
接口
也可以包含域
,但这些域隐式的是 static
和final
的。
可以选择在接口中显示地将方法
声明为 public
,但即使不这么做,它们也是 public 的。
使用接口的核心原因:
- 为了能够向上转型为多个基类型
- 防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口
接口优于抽象类的原因
最明显的区别:
抽象类允许包含某些方法的实现,但是接口则不允许。
更为重要的区别:
为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。因为Java 只允许单继承,所以,抽象类作为类型定义受到了极大地限制。
原因:
1、现有的类可以很容易被更新,以实现新的接口。
例如:当Comparable接口被引入到Java平台中时,会更新许多现有的类,以实现 Comparable接口。一般来说,无法更新现有的类来扩展新的抽象类。
2、接口是定义mixin(混合类型)的理想选择。
例如:Comparable是一个mixin接口,它允许类表明它的实例可以与其他的可相互比较的对象进行排序。这样的接口之所以被称为 mixin,是因为它允许任选的功能可被混合到类型的主要功能中。
3、接口允许构造非层次结构的类型框架。
例如:我们有一个接口代表一个singer,另一个接口代表一个songwriter。但有些 singer 本身也是 songwriter。这种情况不适合层次结构。
Reference
- 《Java编程思想》第九章接口 P170
- 《Effective Java》第18条,接口优于抽象类 P82
- 深入理解Java的接口和抽象类