接口
1. 抽象类和抽象方法
抽象类是普通类与接口之间的一种中庸之道。
抽象类目的是为所有的导出类创建一个通用接口,以此表示所有导出类的共同部分。
- 用其创建对象并没有什么意义,我们希望通过这个通用接口操作一些列类。
- 如果试图产生一个抽象类的对象,那么编译器会给出出错消息,即将类声明为abstract可阻止创建对象。
- 子类继承时返回类型可以是协变类型,而非参数类型。
抽象方法只有声明而没有方法体。
- 具有抽象方法的类被限定为抽象类。
- 抽象类的导出类必须实现这些抽象方法,否则它也是抽象类,编译器保证必须用abstract来修饰导出类。
注意:抽象类不需要所有的方法都是抽象的,甚至可以没有任何抽象方法,只要它被限定为abstract,就可以用来防止用户创建该类的对象。
应用:
- 抽象类可以实现部分方法,而将抽象方法延迟到子类实现。在已经实现的方法中可以调用这些抽象方法来搭建一个基本逻辑,即告诉用户和编译器如何使用,而把实现交给了子类。
实例:spring源码
2. 接口
所有实现了特定的接口的类看起来都像这样
特点:
- 完全抽象
- 用于实现类似多重继承,可以向上转型为多个基类型
使用:
- 可以在interface前加public关键字,否则只具有包访问权限。
- 接口默认是abstract的,像抽象类一样不能实例化。
- 接口可以包含域,这些域隐式地是static和final的,是public的。
- 接口中的方法自动是public的,实现时对于接口中被定义的方法必须是public的。
- 实现该接口的类如果是abstract的,可以不实现接口中的方法。
- 对于特征签名一样的方法,如果接口实现者从其他类中继承了该方法,可以不显式地提供该方法定义。
- 可以扩展接口得到另一个接口。
好处:
- 可复用性更好:对于类来说,只能操作该类或子类(处于该继承结构中的类);如果使用接口,则仅仅是创建了一个结构,所有接口的实现者只要满足该结构即可。
- 多重继承:接口没有任何与接口相关的存储,这避免了c++中的多重继承带来的沉重包袱。