接口定义的是多个类共同的公共行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用方法。
接口的定义
接口定义使用interface关键字,接口定义的基本语法如下:
[修饰符] interface 接口名 extends 父接口1,父接口2...
{
零到多个常量定义;
零到多个抽象方法定义;
}
上面语法的详细说明如下:
(1)修饰符可以是public或者省略,如果省略了public访问修饰符,则默认采用包权限访问控制符,即只有在相同包结构下才可以访问该接口。
(2)接口名应该与类名采用同样的命名规则。从某个角度来说,接口可被当成一个特殊的类,因此一个java源文件里最多只能有一个public接口,如果一个java源文件里定义了一个public接口,则该源文件的主文件名必须与该接口同名。
(3)一个接口可以有多个直接父类接口,但接口只能继承接口,不能继承类。
(4)接口定义的是一种规范,不能创建实例,因此接口里不能包含构造器和初始化块定义。接口里可以包含属性、方法、内部类和枚举类定义。接口中的属性只能是常量,方法只能是抽象方法。
接口里定义的是多个类的共同的公共行为规范,因此接口里所有成员,包括常量、方法、内部类和枚举类都是public访问权限。定义接口成员时,可以省略访问控制修饰符,如果指定访问控制修饰符,只能使用public访问控制修饰符。
对于接口中定义的常量属性而言,它们是接口相关的,而且它们只能是常量,因此系统会自动为这些属性增加static和final两个修饰符。也就是说,在接口中定义属性时,不管是否使用public static final 修饰符,接口里的属性总将使用这三个修饰符来修饰。而且接口里面没有构造器和初始化块,因此接口里定义的属性只能在定义时指定默认值。
接口定义属性采用如下两行代码的结果完全一样:
//系统自动为接口里定义的属性增加public static final 修饰符
int MAX_SIZE=50;
public static final int MAX_SIZE=50;
对于接口里定义的方法而言,它们只能是抽象方法,因此系统自动会为其增加abstract修饰符;由于接口里的方法全是抽象方法,因此接口里不允许定义静态方法,既不可以使用static修饰接口里定义的方法。
使用接口
接口不能用于创建实例,但接口可以用于声明引用类型的变量。当使用接口来声明引用类型的变量时,这个引用类型的变量必须引用到其实现类的对象。除此之外,接口的主要用途就是被实现类实现。
一个类可以实现一个或者多个接口,继承使用extends关键字,实现接口则使用implements关键字。类实现接口的语法格式如下:
[修饰符] class 类名 extends 父类 implements 接口1,接口2...
{
类体部分
}
实现接口与继承父类相似,一样可以获得所实现接口里定义的常量属性、抽象方法、内部类和枚举类定义。
让类实现接口需要定义后增加implements部分,当需要实现多个接口时,多个接口之间以英文逗号(,)隔开。一个类可以继承一个父类,实现多个接口,implements部分必须放在extends部分之后。
一个类实现了一个或者多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽象方法);否则,该类将保留从父接口那里继承到的抽象方法,该类也必须定义成抽象类(该类因为没有重写接口里的全部抽象方法,也变成了抽象类)。