前言
一个类只有有一个直接的父类,但可以实现多个接口。采用这种方式,Java语言对多继承提供了有力的支持。
- 接口的概念和正确使用接口的语法
在Java语言中,接口有两种意思:
- 一是指概念性的接口,即指系统对外提供的所有服务。类的所有能被外部使用者访问的方法构成了类的接口。
- 二是指interface关键字定义的实实在在的接口,也称为接口类型。它用于明确地描述系统对外提供的所有服务,能够更加清晰地把系统的实现细节与接口分离。
接口对成员变量和方法做了许多限制,接口的特征归纳如下:
A.接口中的成员变量默认都是public、static、final类型的(就是公开的静态常量),必须被显示地初始化。
B.接口的方法默认的都是public、abstract类型的。
C.接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。如果在接口中定义实例变量非抽象的实例方法及静态方法,这样是非法的。
D.接口没有构造方法,不能被实例化。在接口中定义构造方法是非法的。
E.一个接口不能实现另一个接口,但它可以继承多个接口。例如接口C继承了接口B和接口A,那么接口C会继承接口A中的所有方法,接口C会继承接口B中的所有方法。
F.接口必须通过类来实现它的抽象方法。类实现接口的关键字是implements。
G.与子类继承抽象父类相似,当类实现了某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须定义为抽象类。
H.不允许创建接口的实现,但允许定义接口类型的引用变量,该变量引用该变量引用实现了这个接口的类的实例。
I.一个类只能继承一个直接的父类,但能实现多个接口。
2.接口和抽象类的比较
接口和抽象类都位于继承树的上层,它们具有共同点:
- 代表系统的抽象层
- 都不能被实例化
- 都能包含抽象方法。这些抽象方法用于描述系统能提供哪些服务,但不必提供具体的实现。
抽象类和接口主要有两大区别:
- 在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这能提高代码的可重用性,这是抽象类的优势所在;而接口中只能包含抽象方法。
- 一个类只能继承一个直接的父类,这个父类有可能是抽象类;但一个类可以实现多个接口,这是接口的优势所在。
接口和抽象类的使用场合:
- 用接口作为系统与外界(即令一个系统)交互的窗口。
- 由于外界使用者依赖系统的接口,并且系统内部会实现接口,因此接口本身必须十分稳定,接口一旦制定,就不允许随意修改,否则会对外界使用者及系统内部都造成影响。
- 用抽象类来定制系统中的扩展点。可以把抽象类看作是介于“抽象”和“实现”之间的半成品,抽象类力所能及的完成了部分实现,但还有一些功能有待于它的子类去实现。
3.与接口相关的设计模式:
- 定制服务模式
- 适配器模式
- 默认适配器模式
- 代理模式
- 标识类型模式
- 常量接口模式