接口是JAVA语言中非常重要的概念,回调是软件设计中常用的模式。JAVA的接口不仅可以用来实现多继承关系,也用来实现回调机制。 java.lang.Comparable 接口和 java.util.Comparator 接口是进行数据对象比较和排序中需要实现的接口,他们在功能和使用方法上都有所不同。
当类只从一个类继承时称为单继承,JAVA语言只允许单继承。如果需要多继承关系,可以通过JAVA语言中的接口实现。
抽象方法只有方法定义,没有方法体,如果一个类包含任何抽象方法,包括直接的和继承所得,则这个类必须是抽象的。如果一个类是抽象的,则不能创建此类的对象。抽象类强制要求他的所有子类重写自己的方法以覆盖抽象方法。
如果存在超类 Animal,显然cat同时具有 Animal和pet的特性,就是说,cat不只是一个animal还是一个pet,除需要继承animal类,还期望能实现pet类。因为JAVA只允许单继承,CAT不能继承animal又继承pat,解决这个问题的方法是定义接口,并通过接口实现多继承。
定义接口
我们把只有抽象方法和常量的抽象类称为接口,接口形式化定义了一组相互有关系的未实现的方法。接口的定义包括接口声明和接口体。
接口声明的语法为:[public] interface 接口名 [extends 父接口名] {。。。。。。}
EXTENDS子句与类声明的extends子句基本相同,不同的是:一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。
接口体包括常量和抽象方法。
接口Pet示例:
interface Pet{
public abstract void speak();
}
public class Dog implements Pet{
public void speak(){
System.out.println("Woof");
}
}
public class Cat implements Pet{
public void speak(){
System.out.println("Meow");
}
}
public class Bird implements Pet{
public void speak(){
System.out.println("Tweedle");
}
}
public class TestAnimals{
public static void main(String args[]){
Pet myPets = new Pet[4];
myPets[0] = new Bird();
myPets[1] = new Cat();
myPets[2] = new Bird();
myPets[3] = new Dog();
for(int index = 0; index<4; index++){
myPets[index].speak();
}
}
}
类Bird ,Cat 和 Dog 与 Pet 不再具有父子关系,而分别是实现了接口Pet的类。
一个接口的定义由关键字 interface 开始,包括一套 public ,abstract 方法,接口也可以包含 public ,final,static数据。一个期望使用接口的类必须将自己声明为 implements 接口,并重写接口定义的每个方法,保证参数列表及返回类型与接口中所定义的相一致。简单说,强制要求实现接口的类覆盖接口的方法。
如果一个类没有覆盖接口定义中的全部方法,那么这个类就称为抽象类,必须贝声明为 abstract。
用Cat类继承Animal 类 和 定义Pet接口的示例:
public class Cat extends Animal implements Pet{
public void speak(){//实现
}
}