接口是一种更深层次的抽象,我们可将其想象为一种”纯“抽象类。它和抽象类相似,但它的成员方法都是抽象方法。
Java中定义接口使用关键词interface
接口的成员方法默认为抽象的、公有的,成员属性默认为静态的、final修饰的。接口只是提供一种形式,具体的实现细节交由实现它的类完成。一个类实现一个接口使用关键词implements,与继承相似,但一个类可以实现多个接口。
例:
interface Flyable{
void fly();
}
abstract class Animal{
int age;
Animal(int a){
age=a;
}
int getAge(){
return age;
}
abstract void speak();//抽象方法
}
class Bird extends Animal implements Flyable{
Bird(int a){
super(a);
}
public void fly(){
System.out.println("Bird is flying");
}
void speak(){
System.out.println("Bird is speaking");
}
}
class Plane implements Flyable{
String type;
Plane(String t){
type=t;
}
public void fly(){
System.out.println("Plane is flying");
}
}
public class FlyableDemo {
public static void main(String args[]){
Bird b=new Bird(2);
Plane p=new Plane("air plane");
System.out.println("The age of Bird is"+b.getAge());
b.fly();
p.fly();
}
}
程序结果:
The age of Bird is2
Bird is flying
Plane is flying
程序结果说明:
程序定义了接口Flyable,这个接口中声明了成员方法fly(),这个方法是抽象的、公有的。程序中还定义了一个抽象类Animal。类Bird继承了类Animal,同时实现接口Flyable。
类Bird和类Plane都实现了接口Flyable。从这两个类的实现可以发现,接口就像建立在类和类之间的”协议“,对于实现某个接口的类必定实现接口中定义的所有方法。
这里需要注意,在接口Flyable中并没有显示的声明fly()方法是公有的,但接口默认的访问控制是公有的,而类中默认的访问控制是"包内友好",因此在Bird和Plane中必须将这个方法用public修饰。
选择接口的好处:使程序更易于扩展。