接口,某种特征的约定
定义接口interface
所有的方法都自动是public abstract
实现接口implements
可以实现多继承
与类的继承关系无关
面向接口编程,而不是面向实现
Flyable f = new bird();
Java中有大量的接口
接口的作用
1.通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。从而在一定意义上实现了多重继承
2.通过接口可以指明多个类需要实现的方法
3.通过接口可以了解对象的交互界面,而不需了解对象所对应的类
示例:
interface Collection{
void add(Object obj);
void delete(Object obj);
Object find(Object obj);
int size();
}
通常接口以able或ible结尾,表明接口可以完成一定的行为。
接口声明中还可以包括对接口的访问权限以及它的父接口列表。完整的接口声明如下:
[public]interface interfaceName[extends listOfSuperInterface]{
……
}
其中public指明任意类均可以使用这个接口,缺省的情况下,只有与该接口位于同一个包中的类才可以访问这个接口
extends子句与类声明中的extends子句基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。子接口继承父接口中所有的常量和方法。
方法的定义格式为:
returnType methodName([paramlist]);
接口中只进行方法的声明,而不提供方法的实现,所以,方法定义没有方法体,且用分号结尾。在接口中声明的方法具有public和abstract属性。所有在定义时,这两个关键词可以省略。
另外,如果在子接口中定义了和父类接口同名的常量或相同的方法,则父接口中的常量被隐藏,方法被重载。
接口的实现
在类的声明中用implements子句来表示一个类使用某个接口,在类体重可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口。
下面在类FIFOQueue类中实现上面定义的接口collection:
class FIFOQueue implements collection{
public void add(Object obj){
……
}
public void delete(Object obj){
……
}
public Object find(Object obj){
……
}
public int currentCount{
……
}
在类中实现接口所定义的方法时,方法的声明必须与接口中所定义的完全一致。
接口类型
接口可以作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。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属性,定义时可省略。
枚举
从JDK1.5起,可以使用枚举
enum Light{Red,Yellow,Green}
使用
Light light=Light.Red;
switch(light){case Red:……break;}
注意:case后面不能写成Light.Red
Java中的枚举是用class来实现的,可以复杂地使用
Java8中的接口
Java8以上,接口成员还可以是:
static方法
具有实现体的方法(default方法)
默认方法的好处是:提供了一个默认实现,子类在implements可以不用再重新写