1、Java程序设计语言提供了接口和抽象类两种机制来定义允多个实现的类型。这两种机制的主要区别有:
1)抽象类允许包含某些方法的实现,但是接口则不允许。
2)为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。
3)因为Java只允许单继承,所以抽象类作为类型定义受到了极大的限制,但是一个类可以实现多个接口。
2、通过第16条中介绍的包装类模式,接口使得安全地增强类的功能成为可能。如果使用抽象类来定义类型,那么程序员除了使用继承的手段来增加功能,没有其他的选择。这样得到的类与包装类相比,功能更差,也更加脆弱。
3、骨架实现类。
虽然接口不允许包含方法的实现,但是使用接口来定义类型并不妨碍你为程序员提供实现上的帮助。通过对你导出的每个重要接口都提供一个抽象的骨架实现类,把接口和抽象的优点结合起来。接口的作用仍然是定义类型,但是骨架实现类接管了所有与接口实现相关的工作。
4、简单实现。
简单实现就像骨架实现,这是因为它实现了接口,并且是为了继承而设计的,但是区别在于它不是抽象的:它是最简单的可能的有效实现。你可以原封不动地使用,也可以看情况将它子类化。
5、优缺点
抽象类的演变比接口的演变要容易的多。如果希望在后续的发行版本中在抽象类中增加新的方法,始终可以增加具体方法,它包含合理的默认实现。然后,抽象类的所有现有实现都提供这个新的方法。对于接口,这样做是行不通的。接口一旦被公开发行,并且已被广泛实现,再想改变这个接口几乎是不可能的。