- 接口,某种特征的约定
定义接口interface
所有方法都自动是public abstract
实现接口implements
可以实现多继承
与类的继承关系无关
- 面向接口编程,而不是面向实现
Flyable f = new Bird()
Java中有大量的接口
其中Flyable为一个接口 Bird为实现此接口的一个类
- 1.通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系,从而在一定意义上实现了多重继承
- 通过接口可以指明多个类需要实现的方法
- 通过接口可以了解对象的交互界面,而不需要了解对象所对应的类
interface Collection{
void add(Object obj);
void delete(Object obj);
Object find(Object obj);
int size();
}
- 通常接口以able或iable结尾,表名接口能完成一定的行为
- 接口声明中还可以包括对接口访问权限以及它的父接口列表。完整的接口声明如下
[public]interface interfaceName [extends listOfSuperInterface]{
......;
}
- 其中public指明任意类均可以使用这个接口,缺省情况下,只有与该接口定义在同一个包中的类才可以访问这个接口
- extends子句与类声明中的extends子句基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。子接口继承父接口中所有的常量和方法
- 接口可以作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该结构类型的变量中,通过这些变量可以访问类所实现的接口中的方法。Java运行时系统动态地确定该使用哪个类中的方法
- 把接口作为一种数据类型可以不需要了解对象所对应的具体的类,以前面所定义的接口Collection和实现该接口的类FIFOQueue为例,下例中,我们以Collection作为引用类型来使用
class InterfaceType{
public static void main(String args[]){
Collection c = new FIFOQueue();
......
c.add(obj);
...
}
}
- 接口体重可以包含常量定义
- 常量定义的格式为:type NAME = value;
- 其中type可以是任意类型,NAME是常量名,通常都大写,value是常量值
- 在接口中定义的常量可以被实现该接口的多个类所共享,它与C中用#define以及C++中用const定义的常量是相同的
- 在接口中定义的常量具有public,static,final的属性
enum Light{ Red, Yellow, Green }
Light light = Light.Red;
switch( light ){ case Red:...break; }
- Java中的枚举是用class来实现的,可以复杂地使用
- Java8以上,接口成员还可以是:
static方法
具有实现体的方法(default方法)
默认方法的好处是:提供了一个默认实现,子类在implements可以不用再重新写了