抽象类与普通类相比最大的特点是约定了子类的实现要求,但是抽象类存在单继承局限。如果要约定子类的实现要求并且避免单继承局限就需要使用接口。
1. 接口概念
接口就是一个抽象方法和全局常量的集合,使用interface关键字进行定义。
子类如果要想使用接口,那么就必须使用implements关键字来实现接口,同时,一个子类可以实现多个接口,可以使用接口来实现多继承的概念,这也是接口相较于抽象类最大的优点。
对于接口的子类(不是抽象类)必须覆写接口中的全部抽象方法。随后可以利用子类的向上转型通过实例化子类来得到接口的实例化对象。即接口也体现出了多态性。
2. 接口的限制
接口中的抽象方法和全局变量,访问权限只允许为public。
在类中(普通类和抽象类),不写访问控制权限的属性方法默认为default包访问权限,而在接口中,默认为public,所以可以对接口中常量和方法的定义进行简化,如下所示:
3. 接口的实现规则
当一个子类即需要实现接口又需要继承抽象类时,请先使用extends继承一个抽象类,而后使用implements实现多个接口,如下所示:
abstract interface A {}
abstract interface B {}
abstract class C {}
class D extends C implements A,B {}
抽象类也是类,所以使用抽象类可以实现多个接口,而且,实现接口的抽象类不用立即实现接口中的方法。
abstract interface A {}
abstract interface B {}
abstract class C implements A,B {}
接口和接口之间也存在着继承关系,而且接口之间的继承可以是多继承。
abstract interface A {}
abstract interface B {}
abstract interface C extends A,B {}
接口中也可以存在一系列的内部结构,包括:内部普通类,内部接口,其中,使用static定义的内部接口就相当于外部接口。但是,在接口中定义这些结构时没有意义的,我们使用接口是为了利用它对子类行为的规范,如果单纯是想使用一个内部结构,直接创建对应的结果就行了。
4. 接口和抽象类的区别
接口和抽象类的非抽象类子类都必须立即实现所有的抽象方法,接口优于抽象类的地方在于接口不存在单继承局限.
除了单继承的局限之外,实际上使用抽象类和接口都是类似的。在实际开发中,抽象类的设计比接口复杂。
接口是Java的核心,慢慢会学到接口更多的使用与设计。
开发之中优先考虑接口,以避免单继承局限。
抽象类是模板,有层次感;接口则更关心行为与混合。