Java程序设计语言提供了接口和抽象类两种机制来定义允许多个实现的类型。
主要区别
抽象类中可以存在某些方法的实现,接口不可以
如果要实现抽象类定义的类型,类必须成为抽象类的子类。而对接口来说,任何一个类,只要实现接口里面必要的方法,就可以了,而且不用管这个类处于类的层次的哪个位置(例如:内部类也可以实现)
java是单继承多实现,所以抽象类作为类型定义受到了极大的限制,但是一个类可以实现多个接口
骨架实现
虽然接口不允许包含方法的实现,但是使用接口来定义类型并不妨碍你为程序员提供实现上的帮助。通过对你导出的每个重要接口都提供一个抽象的骨架实现类,把接口和抽象的优点结合起来。接口的作用仍然是定义类型,但是骨架实现类接管了所有与接口实现相关的工作。
骨架实现上有个小小的不同,就是简单实现。简单实现就像个骨架实现,这是因为它实现了接口并且是为了继承则设计的,但是区别在于它不是抽象的,它就最简单的可能的有效实现,你可以原封不动地使用也可以看情况将它子类化。
优缺点
现有的类可以很容易的被更新,以实现接口的形式
接口是定义mixin(混合类型)的理想选择
接口允许我们构造非层次结构的类型框架
接口使得安全地增强类的功能成为可能
如果使用抽象类来定义类型,那么程序员除了使用继承的手段来增加功能,没有其他的选择。这样得到的类与包装类相比,功能更差,也更加脆弱。
抽象类的演变比接口的演变要容易很多
如果在后续的版本中需要在抽象类中增加新的方法,那么建立一个具体方法后,就可以提供默认的实现,抽象类的所有实现都将提供这个新的方法。而接口,就不能这样做。
接口一旦被公开发型,并且已被广泛实现,再想改变这个接口几乎是不可能的